OpenCL: test di implementazione interna in MQL5 - pagina 70

 
tol64:

Forse Renat può vedere cosa si può imparare da questo. È abbastanza possibile che la nuova specifica dia migliori prestazioni anche in MQL5, vero?

Per quanto riguarda C#/C++, se necessario, possiamo anche scaricarlo. La cosa principale è ottenere il massimo rendimento possibile. ;)

Per il momento, mi sto trattenendo dal riscrivere il CL-optimizer per Sharp sperando che il nuovo MT4 fornisca almeno la versione 1.1 alla fine. Il linguaggio è lo stesso, il compilatore è lo stesso e non ci sono ostacoli principali (non ho davvero bisogno del supporto OpenCL in un tester MT4, anche se continuerò a farlo se appare). Se non viene implementato - penserò a sinistra.
 

Ho testato alcuni degli script in questo thread su una tale macchina:

CPU-Z


CUDA-Z



Per ogni script fornirò un link al post dove è stato pubblicato in modo che altri possano trovarlo rapidamente, eseguire i test e confrontare i risultati se necessario.

Prova 1


Prova 2

2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 013 (1280 passes, 140 ms) : MaxResult==116.05191; Average Result==106.7991
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 014 (1280 passes, 125 ms) : MaxResult==116.05191; Average Result==106.77599
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 015 (1280 passes, 125 ms) : MaxResult==116.05191; Average Result==106.37561
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Generation 016 (1280 passes, 140 ms) : MaxResult==116.05191; Average Result==106.64193
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Optimization finished. Best result == 116.05191 at 16 generation.
2013.11.29 14:29:13     ParallelOptimazer_00-02 (EURUSD,H1)     Total time of optimization == 2 sec 122 ms

Prova 3

scala = 1000

CPU

GPU


Prova 4

2013.11.29 16:02:31     Tast_Mand_ (EURUSD,H1)  1872 msec

Prova 5

2013.11.29 16:39:50     ParallelTester_00-01 x (EURUSD,H1)       CLGetInfoInteger() returned 2
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       OpenCL init OK!
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       GPU time = 62 ms
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       Соunt indicators = 16; Count history bars = 144000; Count pass = 1280
2013.11.29 16:39:51     ParallelTester_00-01 x (EURUSD,H1)       Result on Gpu МахResult==1.34787 at 699 pass
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       CPU time = 14492 ms
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       Соunt indicators = 16; Count history bars = 144000; Count pass = 1280
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       Result on Cpu МахResult==1.34787 at 699 pass
2013.11.29 16:40:05     ParallelTester_00-01 x (EURUSD,H1)       CpuTime/GpuTime = 233.741935483871

Prova 6

2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 0
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) GPU time = 577 ms
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Gpu МахResult==1.57161 at 7031 pass
2013.11.29 16:45:28     ParallelTester_00-01 x_cycle (EURUSD,H1) OpenCL init OK! Device number = 1
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) GPU time = 546 ms
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:45:29     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Gpu МахResult==1.57161 at 7031 pass
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) CPU time = 145144 ms
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) Result on Cpu МахResult==1.57161 at 7031 pass
2013.11.29 16:47:54     ParallelTester_00-01 x_cycle (EURUSD,H1) CpuTime/GpuTime = 265.8315018315018

Prova7

2013.11.29 16:54:52     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 144691 ms
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2013.11.29 16:57:16     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 593 ms
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 243.9983136593592
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2013.11.29 16:57:17     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 546 ms
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 265.0018315018315
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.91969 at 4641 pass
2013.11.29 16:57:18     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------

Test 8

2013.11.29 17:08:08     vect_v2_all_devices (EURUSD,H1) =======================================
2013.11.29 17:08:08     vect_v2_all_devices (EURUSD,H1) OCL martices mul:         ROWS1 = 2000; COLSROWS = 2000; COLS2 = 2000
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) CPUTime = 64.085
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) ---------------
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) Device = 0: time = 0.251 sec.
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 255.319
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1362,1715 ) = -5.34762192;    thirdCPU[ 1362,1715 ] = -5.34762192;    buf[ 1362,1715 ] = -5.34761715
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 365,218 ) = 1.04545093;    thirdCPU[ 365,218 ] = 1.04545093;    buf[ 365,218 ] = 1.04544997
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1461,1678 ) = -0.26404253;    thirdCPU[ 1461,1678 ] = -0.26404253;    buf[ 1461,1678 ] = -0.26404306
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1116,1765 ) = 0.61209172;    thirdCPU[ 1116,1765 ] = 0.61209172;    buf[ 1116,1765 ] = 0.61209279
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 256,499 ) = 2.50011539;    thirdCPU[ 256,499 ] = 2.50011539;    buf[ 256,499 ] = 2.50011611
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 528,1433 ) = 2.69000340;    thirdCPU[ 528,1433 ] = 2.69000340;    buf[ 528,1433 ] = 2.69000053
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 926,1280 ) = 4.74232054;    thirdCPU[ 926,1280 ] = 4.74232054;    buf[ 926,1280 ] = 4.74231577
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 361,1757 ) = 2.25322127;    thirdCPU[ 361,1757 ] = 2.25322127;    buf[ 361,1757 ] = 2.25322032
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1441,400 ) = -1.65504980;    thirdCPU[ 1441,400 ] = -1.65504980;    buf[ 1441,400 ] = -1.65504801
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) sum( 1617,306 ) = -2.14686131;    thirdCPU[ 1617,306 ] = -2.14686131;    buf[ 1617,306 ] = -2.14686537
2013.11.29 17:09:12     vect_v2_all_devices (EURUSD,H1) ________________________
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) read = 4000000 elements
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) Device = 1: time = 0.734 sec.
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) CPUTime / GPUTotalTime = 87.309
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 370,1332 ) = 0.78463894;    thirdCPU[ 370,1332 ] = 0.78463894;    buf[ 370,1332 ] = 0.78463584
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1346,515 ) = 4.13771629;    thirdCPU[ 1346,515 ] = 4.13771629;    buf[ 1346,515 ] = 4.13771629
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 632,631 ) = 0.53385985;    thirdCPU[ 632,631 ] = 0.53385985;    buf[ 632,631 ] = 0.53386015
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 930,102 ) = 6.17934942;    thirdCPU[ 930,102 ] = 6.17934942;    buf[ 930,102 ] = 6.17935467
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 507,167 ) = 2.76653004;    thirdCPU[ 507,167 ] = 2.76653004;    buf[ 507,167 ] = 2.76652718
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1638,1623 ) = -3.40129304;    thirdCPU[ 1638,1623 ] = -3.40129304;    buf[ 1638,1623 ] = -3.40129256
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 208,649 ) = 8.09206963;    thirdCPU[ 208,649 ] = 8.09206963;    buf[ 208,649 ] = 8.09207344
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 298,741 ) = -0.59763604;    thirdCPU[ 298,741 ] = -0.59763604;    buf[ 298,741 ] = -0.59763324
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 1334,521 ) = -2.74508810;    thirdCPU[ 1334,521 ] = -2.74508810;    buf[ 1334,521 ] = -2.74508691
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) sum( 858,760 ) = -7.48025274;    thirdCPU[ 858,760 ] = -7.48025274;    buf[ 858,760 ] = -7.48025846
2013.11.29 17:09:13     vect_v2_all_devices (EURUSD,H1) ________________________



CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
CPU-Z CPUID - System & hardware benchmark, monitoring, reporting
  • www.cpuid.com
CPU-Z is a freeware that gathers information on some of the main devices of your system.
 

Ho anche provato a testare l'indicatoreqpu_EMA-Rainbow di MetaDriver.


Sulla CPU, il risultato è a volte fino a 2x meglio. Ecco il risultato:

2013.12.01 14:12:50     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 811 ms
2013.12.01 14:12:57     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:12:58     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1295 ms

//---

Volodya(MetaDriver), mi mostri i suoi risultati?

P.S. Ho cambiato il mio tipo nel codice del kernel nei parametri della funzione gpuEMA da__global a__local. Un po' più veloce, ma ancora più lento che sulla CPU.

2013.12.01 14:29:46     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at CPU, time = 795 ms
2013.12.01 14:29:51     qpu_Future_EMA-Rainbow (EURUSD,M1)      OpenCL: GPU device 'GeForce GTX 650 Ti BOOST' selected
2013.12.01 14:29:52     qpu_Future_EMA-Rainbow (EURUSD,M1)      Calculate 1000129 bars at GPU (OpenCL), time = 1061 ms
 
tol64:

Ho anche provato a testare l'indicatoreqpu_EMA-Rainbow di MetaDriver.

Sulla CPU, il risultato è a volte fino a 2x meglio. Ecco il risultato:

Volodya(MetaDriver), mi mostri i suoi risultati?

P.S. Cambiato nel codice del kernel nei parametri della funzione gpuEMA da__global a__local. Un po' più veloce, ma ancora più lento che sulla CPU.

I miei risultati sono simili. Questo è stato discusso a lungo ed è logico - il compito è troppo semplice, trasferire la memoria da e verso la scheda video non paga. Il vantaggio della GPU appare in compiti più complessi.
 
MetaDriver:
Ho risultati simili. Questo è stato discusso a lungo, e ha senso - il compito è troppo semplice, trasferire la memoria da e verso la scheda video non paga. Il vantaggio della GPU appare in compiti più complessi.
Capisco, grazie, sperimenterò con compiti più complessi.
 

Un esempio di utilizzo dell'accelerazione GPU per il trading (derivati).

Mark Joshi - famoso per i suoi libri sulla matematica finanziaria, in particolare sui derivati e sul trading di opzioni, ha riportato qui il suo lavoro:

http://ssrn.com/abstract=2388415

Ha tradotto il suo lavoro in stile OOP su GPU CUDA. L'ha iniziato nel 2010, poi ha avuto una pausa, e dal 2011 fino all'estate 2014 è arrivato alla versione 0.3 funzionante. È riuscito a raggiungere un'accelerazione di 100X... 137X volte - e questo su un algoritmo FANTASTICO, che è difficile.

Il lavoro ha usato la libreria QuantLib in C++, che lui stesso ammette di aver dovuto rielaborare sulla falsariga di "OOP ->-> approccio procedurale" - per far funzionare il tutto sulla GPU CUDA.

Egli scrive:

"Ho implementato la tariffazione Monte Carlo dell'IRD con la LMM sulla GPU con i minimi quadrati per le caratteristiche dell'esercizio iniziale.

Potete ottenere il codice da kooderive.sourceforge.net sia in C++ che in CUDA. Il documento è su ......

Ho usato un codice completamente diverso per CUDA rispetto a quello che avevo usato in precedenza per C++. In sostanza, tratto i dati come concetto centrale e uso il codice per agire sui dati. Lo stile è molto funzionale. C'è voluto molto lavoro perché le mie precedenti implementazioni C++ erano orientate agli oggetti".

Il suo progetto stesso è open source:

http://sourceforge.net/projects/kooderive/