OpenCL: test di implementazione interna in MQL5 - pagina 50

 
Mathemat:
Questo è il senso del trucco. L'argomento all'interno di CLContextCreate() non può selezionare esplicitamente la CPU se c'è almeno una GPU esterna.

Non dovrebbe essere così - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Parametri

dispositivo

[in] Numero di dispositivi OpenCL nel sistema, in ordine. Uno dei valori può essere specificato al posto di un numero specifico: CL_USE_ANY - qualsiasi dispositivo OpenCL-enabled disponibile può essere usato; CL_USE_GPU_ONLY- l'emulazione OpenCL è disabilitata e possono essere usati solo dispositivi OpenCL dedicati (schede video).

Документация по MQL5: Работа с OpenCL / CLContextCreate
Документация по MQL5: Работа с OpenCL / CLContextCreate
  • www.mql5.com
Работа с OpenCL / CLContextCreate - Документация по MQL5
 
Rosh: Non dovrebbe essere così - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Penso di sì, non dovrebbe esserlo. Ma dove trovare questo numero e poi scegliere quello giusto?

https://www.mql5.com/ru/docs/opencl/clgetinfointeger? Ma c'è solo una proprietà - il numero di dispositivi, CL_DEVICE_COUNT.

Ne ho uno nel mio sistema, ecco perché restituisce 1.

Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
  • www.mql5.com
Работа с OpenCL / CLGetInfoInteger - Документация по MQL5
 
Ricordatevi di aggiornare all'ultima build 619 e di ricompilare i programmi. Il principio di inizializzazione di OpenCL è cambiato in questa build.
 
Mathemat:

Penso di sì, non dovrebbe esserlo. Ma dove si ottiene questo numero e poi si sceglie quello giusto?



Dovreste provare a specificare CL_USE_GPU_ONLY, allora la scheda video sarà presa e il numero non è necessario.
 
Rosh: Dovreste provare a specificare CL_USE_GPU_ONLY, allora la scheda video viene presa e il numero non è necessario.
Questo è comprensibile. Ma voglio specificare CPU - con una scheda grafica discreta. Come si fa?
 

Fantastico! Quindi la HD4200 non è un dispositivo OpenCL, vero?

Sembra che qui ci sia davvero una pura emulazione della CPU. Mi piace!

E se potessi insegnare a i3 a farlo...

Sto cominciando a sospettare vagamente perché AMD APP SDK non funziona correttamente in MT5 su i3: non tutti i core sono reali, e AMD non ha la tecnologia hypertrading. Probabilmente è per questo che l'autista si inserisce in modo strano.

O forse il trucco è in MT5 che formalmente riconosce il dispositivo ma in realtà non serve a niente?

 
Mathemat:
Ecco il trucco. L'argomento all'interno di CLContextCreate() non può selezionare esplicitamente una CPU se c'è almeno una GPU esterna.

Questo è sulla CPU (nel mio caso è il dispositivo 1):

2012.04.08 21:03:01     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      CpuTime/GpuTime = 74.73506433823529
2012.04.08 21:03:01     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      Result on Cpu МахResult==4.54091 at 2233 pass
2012.04.08 21:03:01     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 21:03:01     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      CPU time = 325247 ms
2012.04.08 20:57:36     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      Result on Gpu МахResult==4.54091 at 2233 pass
2012.04.08 20:57:36     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 20:57:36     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      GPU time = 4352 ms
2012.04.08 20:57:32     ParallelTester_00-02-(16 x7x3) (USDJPY,M30)      OpenCL init OK!

Il parametro CLContextCreate(device) è stato trasformato in un parametro di script. Potete curiosare tra tutte le opzioni.

// Forse c'è ancora una combinazione segreta e puzzolente? :))

 

2012.04.08 22:01:08    Terminal    CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version 2.0 (sse2))

2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    CpuTime/GpuTime = 26.95192501511792
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Result on Cpu МахResult==4.98137 at 1628 pass
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 22:05:59    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    CPU time = 267417 ms
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Result on Gpu МахResult==4.98137 at 1628 pass
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.08 22:01:32    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    GPU time = 9922 ms
2012.04.08 22:01:22    ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)    OpenCL init OK!


Grazie, non lo sapevo...

Beh, ero abbastanza sicuro che il rapporto sarebbe stato di circa 3 a 1: avete 3 volte più core, 74,735/26,952 ~ 2,77. E questa è una buona notizia: più core significa più guadagno! AMD si è tirata indietro anche qui - a causa del numero di core!

Ma mi chiedo cosa avranno gli altri - diciamo, qualcuno con un i5 Sandy Bridge?

E se qualcuno ha un Bulldozer e, potrebbe essere davvero bello... anche se potrebbe non esserlo, perché è un po' un problema di FPU.

 
MetaDriver:

E in questo test, per qualche motivo, il mio ferro ha strappato il tuo.

2012.04.09 01:09:36        ParallelTester_00-02-316x7x3j (EURUSD,H1)          CpuTime/GpuTime = 161.0007722007722

2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Result on Cpu МахResult==4.85831 at 2497 pass
2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.09 01:09:36    ParallelTester_00-02-316x7x3j (EURUSD,H1)    CPU time = 208496 ms
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Result on Gpu МахResult==4.85831 at 2497 pass
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    Соunt inticators = 16; Count history bars = 50000; Count pass = 4096
2012.04.09 01:06:08    ParallelTester_00-02-316x7x3j (EURUSD,H1)    GPU time = 1295 ms

2012.04.09 01:06:07        ParallelTester_00-02-316x7x3j (EURUSD,H1)           OpenCL init OK!


Ed ecco questo test su OpenCL CPU (tutti e 4 i core sono caricati al 100%)

2012.04.09 01:11:15    ParallelTester_00-02-316x7x3j (EURUSD,H1)    GPU time = 68547 ms

2012.04.09 01:10:07    ParallelTester_00-02-316x7x3j (EURUSD,H1)    OpenCL init OK!


La GPU ha 480 mosche e la CPU ne ha 4, la differenza è di 120 volte, cioè 120 volte più calcoli possono essere fatti contemporaneamente, ma la CPU è rimasta indietro rispetto alla GPU solo 68547/1295=52,9 volte. Ciò significa che il thread della CPU è più veloce di quello della GPU, ma la GPU vince solo perché può eseguire più compiti simultanei. Ho capito bene?


Lo scaling sulla CPU è molto meno del 100% (circa 76%), invece di 4x solo 3x di accelerazione 208496/68547=3.04

Anche se le specificità di questo test possono influenzarlo.

 

Andrei, penso che tu abbia sbagliato qualcosa: MD ha postato questo test qui solo sulla CPU, senza la scheda grafica, cioè selezionando direttamente l'emulazione della CPU. Da quanto ho capito, il tuo primo test è sulla scheda grafica.

E il risultato della tua scheda grafica emulatrice OpenCL (il tuo secondo test) sembra essere sospettosamente basso anche in confronto al mio (ho avuto circa 10 secondi su "GPU").

Se ho capito male qualcosa, correggetemi.