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.
[Eliminato]  

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/