OpenCL: pruebas de implementación interna en MQL5 - página 50

 
Mathemat:
En esto consiste el truco. El argumento dentro de CLContextCreate() no puede seleccionar explícitamente la CPU si hay al menos una GPU externa.

No debería ser así - https://www.mql5.com/ru/docs/opencl/clcontextcreate

Parámetros

dispositivo

[in] Número de dispositivos OpenCL en el sistema, en orden. Se puede especificar uno de los valores en lugar de un número concreto: CL_USE_ANY - se puede utilizar cualquier dispositivo disponible habilitado para OpenCL; CL_USE_GPU_ONLY- se desactiva la emulación de OpenCL y sólo se pueden utilizar dispositivos dedicados a OpenCL (tarjetas de vídeo).

Документация по MQL5: Работа с OpenCL / CLContextCreate
Документация по MQL5: Работа с OpenCL / CLContextCreate
  • www.mql5.com
Работа с OpenCL / CLContextCreate - Документация по MQL5
 

Creo que sí, no debería ser así. Pero, ¿dónde conseguir este número y luego elegir el correcto?

¿https://www.mql5.com/ru/docs/opencl/clgetinfointeger? Pero sólo hay una propiedad: el número de dispositivos, CL_DEVICE_COUNT.

Tengo uno en mi sistema, por eso devuelve 1.

Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
Документация по MQL5: Работа с OpenCL / CLGetInfoInteger
  • www.mql5.com
Работа с OpenCL / CLGetInfoInteger - Документация по MQL5
 
Recuerde actualizar a la última compilación 619 y recompilar los programas. El principio de inicialización de OpenCL ha cambiado en esta versión.
 
Mathemat:

Creo que sí, no debería ser así. Pero, ¿de dónde se obtiene este número y luego se elige el correcto?



Deberías intentar especificar CL_USE_GPU_ONLY, entonces la tarjeta de video será tomada y el número no será necesario.
 
Rosh: Deberías probar a especificar CL_USE_GPU_ONLY, entonces se toma la tarjeta de vídeo y no se necesita el número.
Esto es comprensible. Pero quiero especificar CPU - con una tarjeta gráfica discreta. ¿Cómo lo hago?
 

¡Impresionante! Así que la HD4200 no es un dispositivo OpenCL, ¿verdad?

Parece que realmente se trata de una emulación pura de la CPU. Me gusta.

¿Y si pudiera enseñar al i3 a hacerlo...

Empiezo a sospechar vagamente por qué el SDK de AMD APP no funciona correctamente en MT5 en i3: no todos los núcleos son reales, y AMD no tiene tecnología hypertrading. Probablemente, es por eso que el conductor es de alguna manera distorsionada.

¿O tal vez el truco está en MT5 que reconoce formalmente el dispositivo pero en realidad no sirve para nada?

 
Mathemat:
Aquí está el truco. El argumento dentro de CLContextCreate() no puede seleccionar explícitamente una CPU si hay al menos una GPU externa.

Esto es en la CPU (en mi caso es el 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!

El parámetro CLContextCreate(device) se ha convertido en un parámetro de script. Se puede hurgar en todas las opciones.

// ¿Tal vez todavía hay una combinación secreta apestosa? :))

Archivos adjuntos:
 

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!


Gracias, no lo sabía...

Bueno, estaba bastante seguro de que la proporción sería de 3 a 1: tienes 3 veces más núcleos, 74,735/26,952 ~ 2,77. Y eso es una buena noticia: ¡más núcleos significa más ganancia! AMD también se ha desmarcado en este caso, debido al número de núcleos.

Pero me pregunto qué tendrán los demás, por ejemplo, alguien con un i5 Sandy Bridge.

Y si alguien tiene un Bulldozer e, podría ser realmente genial... aunque puede que no, porque es un problema de la FPU.

 
MetaDriver:

Y en esta prueba, por alguna razón, mi plancha rompió la suya.

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!


Y aquí está esta prueba en la CPU OpenCL (los 4 núcleos están cargados 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 tiene 480 moscas y la CPU tiene 4, la diferencia es de 120 veces, es decir, se pueden hacer 120 veces más cálculos a la vez, pero la CPU se queda por detrás de la GPU sólo 68547/1295=52,9 veces. Esto significa que el hilo de la CPU es más rápido que el de la GPU, pero la GPU sólo gana porque puede realizar más tareas simultáneas. ¿Lo he entendido bien?


El escalado en la CPU es mucho menor que el 100% (alrededor del 76%), en lugar de 4x sólo 3x aceleración 208496/68547=3,04

Aunque, las particularidades de esta prueba pueden estar afectando.

 

Andrei, creo que te has equivocado en algo: MD sólo ha publicado esta prueba aquí en la CPU, sin la tarjeta gráfica, es decir, seleccionando directamente la emulación de la CPU. Según tengo entendido, su primera prueba es en la tarjeta gráfica.

Y el resultado de tu tarjeta gráfica emuladora de OpenCL (tu segunda prueba) parece ser sospechosamente bajo incluso en comparación con el mío (tuve unos 10 segundos en "GPU").

Si he entendido algo mal, corrígeme.