OpenCL: test di implementazione interna in MQL5 - pagina 64

 

http://www.ixbt.com/video3/rad2.shtml- È meglio usare librerie ottimizzate per i big data piuttosto che diventare "creativi" con la scrittura di programmi in OpenCL (non lo escludo). È possibile utilizzare un sistema ibrido, dove piccole quantità sono gestite utilizzandoOpenCL e grandi quantità sono gestiteutilizzando librerie ottimizzate. Potrebbe essere necessario convertire la libreria in un linguaggio di programmazione specifico e creare condizioni per l'inclusione di questa libreria. Se questo può essere implementato, darebbe un risultato impressionante e di conseguenza accelererebbe l'operazione molte volte. Nota a .....

P.S Questo potrebbe essere un nuovo thread nel forum

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Può essere necessario convertire le librerie in un linguaggio di programmazione specifico e creare condizioni per abilitare questa libreria. Se questo può essere implementato, si otterrà un risultato impressionante e di conseguenza l'operazione sarà accelerata molte volte.

Non è tecnologico per gli sviluppatori mettere a punto il compilatore specificamente per un prodotto estremamente specifico, anche se unico.

E finora non vedo nessun compito del trader che richieda una dimensione così grande di matrici moltiplicate.

 
MetaQuotes:

Annuncio dell'aggiornamento di MetaTrader 5

Un aggiornamento della piattaforma MetaTrader 5 sarà pubblicato nei prossimi giorni. Una volta pubblicato l'aggiornamento, ci sarà un ulteriore comunicato stampa contenente la lista finale dei cambiamenti e i numeri di build. Sono previste le seguenti modifiche:

Terminale client MetaTrader 5 build 648

MetaTester: aggiunto il supporto per l'utilizzo di programmi OpenCL negli agenti di test.

Quelli che capiscono OpenCL, preparano un task-test sotto Cloud+OpenCL. Prospettive matematiche molto interessanti.
 
hrenfx: Capire OpenCL, preparare un task-test per Cloud+OpenCL. Prospettive matematiche molto interessanti.
Questo è più per MetaDriver. È un grande specialista di OpenCL qui e sta cercando di emulare i test.
 
hrenfx:
Capire OpenCL, preparare un task-test per Cloud+OpenCL. Prospettive matematiche molto interessanti.
Matematica:
Questo è più per MetaDriver........................
Ci penserò, ho bisogno di alcune idee in termini di cosa esattamente deve essere calcolato.
 

Driver video aggiornato di recente (NVIDIA301.42).

Ho fatto uno dei vecchi test per interesse (ParallelTester_00-01x) e non potevo credere ai miei occhi.

Nella pagina 24 stavo facendo dei test e ce n'erano 29, poi ho impostato la memoria in modalità 2 canali ed è andata a 39.

Ora è ~306.

2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 141 ms
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 43259 ms
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 306.8014184397163
2012.05.31 21:41:04     OpenCL  GPU: NVIDIA Corporation GeForce GT 440 with OpenCL 1.1 (2 units, 1660 MHz, 1023 Mb, version 301.42)
2012.05.31 21:41:04     OpenCL  CPU: AuthenticAMD AMD Athlon(tm) II X4 630 Processor with OpenCL 1.1 (4 units, 2948 MHz, 2048 Mb, version 2.0)
Incredibile. Sembra che NVIDIA abbia modificato umanamente i driver.
 

fyords, come hai fatto a far apparire gli eventi precedenti più in alto nel registro?

Ma in generale è fantastico, ti capisco. Ero altrettanto felice quando ho comprato la mia HD 4870 a buon mercato e ho visto la sua potenza.

Una piccola raccomandazione: scegliete i parametri in modo che il tempo di esecuzione della GPU sia paragonabile a 1 secondo. Allora anche il rapporto temporale sarà più accurato. L'errore medio della funzione GteTickCount() non è inferiore alle decine di millisecondi. Quindi potreste facilmente ottenere 120 ms o 170 ms sulla GPU. E il valore dell'accelerazione dipende molto da questo.

Ho messo un po' a punto questo script per farlo funzionare su tutti i dispositivi disponibili (guarda dal basso verso l'alto: 1) CPU su piattaforma Intel, poi 2) HD 4870 su piattaforma AMD, e 3) CPU su piattaforma AMD):

2012.05.31 15:48:35     OpenCL  CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version 2.0 (sse2))
2012.05.31 15:48:35     OpenCL  GPU: Advanced Micro Devices, Inc. ATI RV770 with OpenCL 1.0 (10 units, 780 MHz, 512 Mb, version CAL 1.4.1720)
2012.05.31 15:48:35     OpenCL  CPU: Intel(R) Corporation  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.1 (2 units, 2800 MHz, 8040 Mb, version 1.1)

I risultati dello script sono dal basso verso l'alto!

2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 24.76943755169562
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 9672 ms
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 2
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 204.7606837606838
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 1170 ms
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 77.55584331498866
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 3089 ms
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 239570 ms
2012.06.01 01:01:58     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
A quest'ultimo parametro, che è 10 volte meno, la mia scheda non è veloce come la tua. Probabilmente non ha il tempo di overcloccare correttamente :)
 
Per informazione, GetTickCount ha un tasso di errore ben al di sotto dei 16 ms, non è che state usando Windows 95.
 
Mathemat:

fyords, come hai fatto a far apparire gli eventi precedenti più in alto nel registro?

Nei rapporti, pulsante destro "Visualizza", nuova finestra pulsante "Query" e il registro è costruito per tempo correttamente, ed è più comodo da leggere (per me).

Per quanto riguarda lo script, grazie, lo proverò domani, è una lunga attesa per il suo completamento, soprattutto con Count pass = 12800.

Per ora ecco un vecchio script con Count pass = 12800

2012.06.01 01:05:53     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 999 ms
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 434167 ms
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 434.6016016016016
Il guadagno è diventato ancora più grande.
 
Renat: Per informazione: GetTickCount ha un errore molto inferiore a 16 ms, non è che state usando Windows 95.

L'errore in realtà non è molto inferiore. Sì, vicino ad esso, ma ci sono dei fuori scala rispetto alla media, che si raggruppano intorno a 32, 48 e anche di più. Sono rari, non discuto, possono essere ignorati.

Ma quando una persona esegue uno script, non sta necessariamente facendo qualcosa sul computer. E il sistema può anche eseguire i propri compiti, il che può rallentare l'esecuzione.

Tecnicamente, la deviazione standard è effettivamente piccola, circa 6-7, e debolmente dipendente dal tempo di esecuzione stesso. Ma riflette male la vera variazione. Ecco un istogramma dei tempi registrati quando si eseguono gli stessi calcoli:

La distanza tra barre adiacenti è di 16ms. Le colonne più piccole sono abbastanza probabili, e differiscono l'una dall'altra anche di 32ms. Se la colonna centrale ("tempo di esecuzione reale") è di 140 millisecondi, allora quella di sinistra è di 124 ms e quella di destra di 156 ms.

Quindi, la variazione reale, se divisa per il basso tempo di esecuzione della GPU, può essere abbastanza grande:

20 secondi/124ms ~ 161

20 secondi/156 ms ~ 128.

Il "vero rapporto" dei tempi di esecuzione corrisponde approssimativamente alla barra più grande:

20 sec/140ms ~ 143.

Se prendiamo un tempo di esecuzione più lungo sulla GPU, l'impatto di questo errore sarà molto minore. Almeno che sia di 500ms.

Script per la simulazione:

#define BIG       10000000
#define SMALL     1000

void OnStart( )
{
   Print( "Script started..." );
   double k;
   int times[ SMALL ];
   MathSrand( TimeCurrent( ) );
   for( int ii = 0; ii < SMALL; ii ++ )
   {
      Comment( ii );
      int st = GetTickCount( );
      for( int i = 0; i < BIG; i ++ )   k = sin( i );
      int timeTotal = GetTickCount( ) - st;
      times[ ii ] = timeTotal;
   }

   int h = FileOpen( "gtc_times.txt", FILE_WRITE, "\r\n"  );
   for( int ii = 0; ii < SMALL; ii ++ )
      FileWrite( h, times[ ii ] );   
   FileClose( h ); 
   Print("Script unloaded");
}
//+------------------------------------------------------------------+