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

 
MetaDriver:

...

--

Haz 512 y mira lo que consigues. No tengas miedo de machacar el programa, sólo lo mejorará. :) Cuando lo hayas hecho, publícalo aquí.

¡BIEN! Con 512 pases y 144000 bares:

PK      0       po_00-02 (GBPJPY,M5)    23:38:29        OpenCL init OK.
LS      0       po_00-02 (GBPJPY,M5)    23:38:30        Generation 001 (512 passes, 1186 ms) : MaxResult==81.21127; Average Result==24.14348
PR      0       po_00-02 (GBPJPY,M5)    23:38:32        Generation 002 (512 passes, 1170 ms) : MaxResult==88.56933; Average Result==45.67882
RF      0       po_00-02 (GBPJPY,M5)    23:38:33        Generation 003 (512 passes, 1170 ms) : MaxResult==100.78146; Average Result==66.20171
RF      0       po_00-02 (GBPJPY,M5)    23:38:34        Generation 004 (512 passes, 1170 ms) : MaxResult==107.30714; Average Result==82.67181
RG      0       po_00-02 (GBPJPY,M5)    23:38:35        Generation 005 (512 passes, 1170 ms) : MaxResult==115.61784; Average Result==93.52664
DG      0       po_00-02 (GBPJPY,M5)    23:38:36        Generation 006 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==100.41042
CG      0       po_00-02 (GBPJPY,M5)    23:38:37        Generation 007 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==103.95667
JF      0       po_00-02 (GBPJPY,M5)    23:38:39        Generation 008 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==105.85167
NI      0       po_00-02 (GBPJPY,M5)    23:38:40        Generation 009 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.22531
MI      0       po_00-02 (GBPJPY,M5)    23:38:41        Generation 010 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.33067
GH      0       po_00-02 (GBPJPY,M5)    23:38:42        Generation 011 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.23798
DK      0       po_00-02 (GBPJPY,M5)    23:38:43        Generation 012 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.02062
PK      0       po_00-02 (GBPJPY,M5)    23:38:44        Generation 013 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==105.62199
CJ      0       po_00-02 (GBPJPY,M5)    23:38:44        Optimization finished. Best result == 116.37332 at 13 generation.
RM      0       po_00-02 (GBPJPY,M5)    23:38:44        Total time of optimization == 15 sec 226 ms

Bueno y si 60 es lo óptimo, pues en general genial:

FG      0       po_00-02 (GBPJPY,M5)    23:39:44        OpenCL init OK.
OO      0       po_00-02 (GBPJPY,M5)    23:39:44        Generation 001 (60 passes, 312 ms) : MaxResult==91.27985; Average Result==38.30907
RN      0       po_00-02 (GBPJPY,M5)    23:39:44        Generation 002 (60 passes, 312 ms) : MaxResult==94.08679; Average Result==48.68662
DR      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 003 (60 passes, 296 ms) : MaxResult==108.52215; Average Result==58.43468
IS      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 004 (60 passes, 312 ms) : MaxResult==129.80438; Average Result==65.32684
DP      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 005 (60 passes, 297 ms) : MaxResult==144.99834; Average Result==73.78468
MQ      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 006 (60 passes, 297 ms) : MaxResult==144.99834; Average Result==79.96281
QF      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 007 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==85.70296
EG      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 008 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==87.95421
PD      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 009 (60 passes, 296 ms) : MaxResult==152.74852; Average Result==89.29836
CE      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 010 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==87.88991
OI      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 011 (60 passes, 296 ms) : MaxResult==152.74852; Average Result==85.3231
HK      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 012 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==81.60567
IH      0       po_00-02 (GBPJPY,M5)    23:39:48        Generation 013 (60 passes, 297 ms) : MaxResult==152.74852; Average Result==77.38504
QI      0       po_00-02 (GBPJPY,M5)    23:39:48        Generation 014 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==76.46695
EM      0       po_00-02 (GBPJPY,M5)    23:39:48        Optimization finished. Best result == 152.74852 at 14 generation.
PO      0       po_00-02 (GBPJPY,M5)    23:39:48        Total time of optimization == 4 sec 290 ms

//---

Es decir, en el portátil más débil presentado en este hilo, este es el resultado. Es muy prometedor.

//---

Desgraciadamente, no puedo hablar del tema con libertad, ya que ni siquiera me he metido en el artículo de joo y las redes neuronales, mientras que nunca he escarbado en OpenCL. No puedo usar este o aquel código sin entender cada línea de código. Quiero saberlo todo. ))) Todavía estoy trabajando en el motor del programa de comercio. Hay tanto que hacer que mi cabeza ya está dando vueltas. )))

 

Aumento de CountBars por un factor de 30 (a 4.320.000), decidió probar la resistencia de la piedra a la carga.

No importa: funciona, se calienta, pero no suda demasiado. La temperatura sube lentamente, pero ya ha alcanzado la saturación.

La línea roja es la temperatura, la línea verde es la carga de los núcleos.


Por eso me encanta el ejemplar Sandy Bridge de Intel: es "verde". Sí, los gráficos no son geniales, pero ya veremos en qué se convierte Ivy Bridge...
 
Mathemat:

...

Por eso me encanta el modelo Sandy Bridge de Intel: es "verde". Sí, los gráficos no son muy buenos, pero ya veremos en qué se convierte Ivy Bridge...

Oh. Eso sí que es una prueba de esfuerzo. :) El mío probablemente ya estaría muerto.

Luego que un Haswell y luego un Rockwell un poco más tarde... )))

 

Un ejemplo de implementación del helecho de Barnsley en OpenCL.

El cálculo se basa en el algoritmo Chaos Game(ejemplo) y utiliza un generador de números aleatorios con una base de generación que depende del ID del hilo y devuelve get_global_id(0) para crear trayectorias únicas.

IFS fern OpenCL

Al escalar, el número de puntos necesarios para mantener la calidad de la imagen crece cuadráticamente, por lo que esta implementación asume que cada instancia del núcleo dibuja un número fijo de puntos que caen dentro del área visible.

El número de hilos estimados se especifica en la línea 191:

   uint  work  []={500};

el número de puntos está en la línea 233:

   float pointsneeded=float(MathRound(1500+scale));

UPD

IFS-fern.mq5 - CPU análoga

A escala=1000:


Chaos game - Wikipedia, the free encyclopedia
Chaos game - Wikipedia, the free encyclopedia
  • en.wikipedia.org
In mathematics, the term chaos game, as coined by Michael Barnsley,1 originally referred to a method of creating a fractal, using a polygon and an initial point selected at random inside it.2 The fractal is created by iteratively creating a sequence of points, starting with the initial random point, in which each point in the sequence is a...
Archivos adjuntos:
 
Precioso.
 

He hecho tres capas de neuronas de 16x7x3. En realidad, lo he hecho anteayer, lo he depurado hoy. Antes de eso los resultados no encajaban al comprobarlo con la CPU - no describiré aquí las razones, al menos no ahora - tengo demasiado sueño. :)

Características temporales :

2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  CpuTime/GpuTime = 776.72 18045112782
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Result on Cpu МахResult==1.06443 at 1004 pass
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  CPU time = 206608 ms
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Result on Gpu МахResult==1.06443 at 1004 pass
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  GPU time = 266 ms

Mañana haré el optimizador para esta rejilla. Luego me ocuparé de cargar datos reales y terminar el probador hasta cálculos realistas verificables con MT5-tester. Luego me ocuparé del generador MLP+cl-codes de las rejillas para su optimización.

No publico el código fuente por avaricia, pero se incluye el ex5 para aquellos que quieran probarlo en su hardware.

Archivos adjuntos:
 
MetaDriver: No subo el código fuente, por avaricia, pero para aquellos, que quieran probarlo en su hardware, se adjunta el ex5.

Estoy tan estable como bajo Putin:

2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CpuTime/GpuTime = 24.08037178786222
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Cpu МахResult==1.09311 at 771 pass
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CPU time = 176172 ms
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Gpu МахResult==1.09311 at 771 pass
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    GPU time = 7316 ms
2012.03.08 05:35:18    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    OpenCL init OK!


Por cierto, presta atención: en tiempo de ejecución de la CPU la diferencia entre tu sistema y el mío (basado en Pentium G840) no es tan grande.

¿Es rápida su memoria RAM? Tengo 1333 MHz.

Una cosa más: es interesante que ambos núcleos se carguen en la CPU durante los cálculos. La brusca caída de la carga al final es posterior al final de los cálculos. ¿Qué significa eso?


 
Mathemat:

Estoy tan estable como bajo Putin:

2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CpuTime/GpuTime = 24.08037178786222
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Cpu МахResult==1.09311 at 771 pass
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CPU time = 176172 ms
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Gpu МахResult==1.09311 at 771 pass
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    GPU time = 7316 ms
2012.03.08 05:35:18    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    OpenCL init OK!


1. Por cierto, fíjate en la diferencia entre tu sistema y el mío (basado en Pentium G840) en el tiempo de ejecución de la CPU.

2. ¿Es rápida su memoria RAM? Tengo 1333 MHz.

1. He estado restaurando mi overclocking en mi tiempo libre. Una vez tuve un fallo muy grave (descubrí después que el cable de alimentación de la unidad se había caído), así que pulsé el botón "MemoryOK" de la placa base en busca de un milagro. Después de eso, seguía sin funcionar, sólo que la configuración de la CMOS se restableció a los valores predeterminados. Ahora, he vuelto a overclockear el procesador a 3840 MHz, por lo que ahora funciona de forma más inteligente.

2. Todavía no puedo entenderlo. :) En particular, el benchmark, al que Renat mostró el enlace, muestra 1600MHz. El Windows muestra incluso 1033MHz :)))), a pesar de que la memoria en sí es de 2GHz, pero mi madre puede tirar hasta 1866 (figuradamente).

 
Mathemat:

Una cosa más: es interesante que tenga los dos núcleos cargados al calcular en la CPU. La brusca caída de la carga al final es posterior al final de los cálculos. ¿Qué significaría?

Así que tal vez no es en la GPU en absoluto? El conductor es hasta, pero ... Mi única explicación es que el cálculo se realiza en CPU-OpenCL, sólo que, por supuesto, en todos los núcleos disponibles y utilizando instrucciones vectoriales SSE. :)

La segunda variante es que cuente simultáneamente con la CPU y el CPU. No sé cómo se implementa este soporte (CPU-LPU) por el controlador, pero en principio no excluyo tal variante de inicio de procesamiento de opentCL también.

Esta es mi especulación, en todo caso. O, como está de moda escribir ahora, "IMHO". ;)

 
MetaDriver: La única explicación que tengo es que el cálculo se hace en la CPU OpenCL usando todos los núcleos disponibles y las instrucciones vectoriales SSE, claro. :)

Lo dudo. Sobre todo porque sólo tengo dos núcleos. ¿De dónde sale entonces el beneficio de 25 veces?

Si tienes Intel Math Kernel Library o Intel Performance Primitives (no los he descargado), es posible... en algunos casos. Pero es poco probable, ya que pesan cientos de megas.

Tendré que ver qué dice Google al respecto.

Mathemat: También, curiosamente, mis cálculos de la CPU tienen ambos núcleos cargados.

No, me refería a la computación pura de la CPU sin ningún tipo de OpenCL. La carga está justo por debajo del 100%, donde cada núcleo tiene valores de carga comparables. Pero cuando se ejecuta código OpenCL, sube al 100%, lo que puede explicarse fácilmente por el funcionamiento de la GPU.