OpenCL: pruebas de implementación interna en MQL5 - página 50
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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).
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.
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.
¡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?
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):
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? :))
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.
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 pass2012.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.