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

 

http://www.ixbt.com/video3/rad2.shtml- Es mejor utilizar librerías optimizadas para big data que ponerse "creativo" escribiendo programas en OpenCL (no lo descarto). Se puede utilizar un sistema híbrido, en el que las cantidades pequeñas se manejan conOpenCL y las grandescon bibliotecas optimizadas. Es posible que tenga que convertir la biblioteca a un lenguaje de programación específico y crear condiciones para la inclusión de esta biblioteca. Si esto se puede llevar a cabo, daría un resultado impresionante y, en consecuencia, aceleraría la operación muchas veces. Nota para .....

P.D Esto puede ser un nuevo hilo en el foro

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Puede ser necesario convertir las bibliotecas a un lenguaje de programación específico y crear condiciones para habilitar esta biblioteca. Si se puede aplicar esto, se obtendrá un resultado impresionante y, en consecuencia, la operación se acelerará muchas veces.

No es tecnológico que los desarrolladores ajusten el compilador específicamente para un producto extremadamente específico, aunque único.

Y hasta ahora no veo ninguna tarea de los comerciantes que requiera un tamaño tan grande de matrices multiplicadas.

 
MetaQuotes:

Anuncio de la actualización de MetaTrader 5

En los próximos días se publicará una actualización de la plataforma MetaTrader 5. Una vez publicada la actualización, habrá un comunicado de prensa adicional con la lista final de cambios y los números de compilación. Se prevén los siguientes cambios:

Terminal de cliente MetaTrader 5 build 648

MetaTester: Se ha añadido soporte para el uso de programas OpenCL en los agentes de prueba.

Los que entienden de OpenCL, preparan una tarea-prueba bajo Cloud+OpenCL. Perspectivas matemáticas muy interesantes.
 
hrenfx: Entendiendo OpenCL, prepara una tarea-prueba para Cloud+OpenCL. Perspectivas matemáticas muy interesantes.
Esto es más para MetaDriver. Es un gran especialista en OpenCL y está tratando de emular las pruebas.
 
hrenfx:
Entendiendo OpenCL, prepara una tarea-prueba para Cloud+OpenCL. Perspectivas matemáticas muy interesantes.
Matemáticas:
Eso es más para MetaDriver........................
Lo pensaré. Necesito algunas ideas en cuanto a lo que hay que computar exactamente.
 

Controlador de vídeo recientemente actualizado (NVIDIA301.42).

Hice una de las antiguas pruebas por interés (ParallelTester_00-01x) y no podía creer lo que veía.

En la página 24 estaba haciendo pruebas y había 29, luego puse la memoria en modo 2 canales y pasó a 39.

Ahora es ~306.

2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 141 ms
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:11     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 43259 ms
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 1280
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.31 22:05:54     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 306.8014184397163
2012.05.31 21:41:04     OpenCL  GPU: NVIDIA Corporation GeForce GT 440 with OpenCL 1.1 (2 units, 1660 MHz, 1023 Mb, version 301.42)
2012.05.31 21:41:04     OpenCL  CPU: AuthenticAMD AMD Athlon(tm) II X4 630 Processor with OpenCL 1.1 (4 units, 2948 MHz, 2048 Mb, version 2.0)
Increíble. Parece que NVIDIA ha ajustado los drivers humanamente.
 

fyords, ¿cómo has hecho para que los eventos anteriores aparezcan más arriba en el registro?

Y en general es genial, te entiendo. Yo también me alegré cuando compré mi HD 4870 a precio de saldo y vi su potencia.

Una pequeña recomendación: elegir los parámetros de manera que el tiempo de ejecución de la GPU sea comparable a 1 segundo. Entonces, la relación de tiempo también será más precisa. El error medio de la función GteTickCount() no es inferior a decenas de milisegundos. Así que podrías conseguir fácilmente 120 ms o 170 ms en la GPU. Y el valor de la aceleración depende en gran medida de esto.

He afinado un poco este script para que funcione en todos los dispositivos disponibles (mira de abajo a arriba: 1) CPU en plataforma Intel, luego 2) HD 4870 en plataforma AMD, y 3) CPU en plataforma AMD):

2012.05.31 15:48:35     OpenCL  CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version 2.0 (sse2))
2012.05.31 15:48:35     OpenCL  GPU: Advanced Micro Devices, Inc. ATI RV770 with OpenCL 1.0 (10 units, 780 MHz, 512 Mb, version CAL 1.4.1720)
2012.05.31 15:48:35     OpenCL  CPU: Intel(R) Corporation  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.1 (2 units, 2800 MHz, 8040 Mb, version 1.1)

Los resultados del guión son de abajo hacia arriba.

2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 24.76943755169562
2012.06.01 01:06:12     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 9672 ms
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 2
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 204.7606837606838
2012.06.01 01:06:02     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 1170 ms
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 1
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ------------
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CpuTime/GpuTime = 77.55584331498866
2012.06.01 01:06:01     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     GPU time = 3089 ms
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Device number = 0
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     -------------------------
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     Соunt indicators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:57     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     CPU time = 239570 ms
2012.06.01 01:01:58     ParallelTester_00-01 x_new_cycle (EURUSD,H1)     ========================================
Con este último parámetro, que es 10 veces menor, mi tarjeta no es tan rápida como la suya. Probablemente no tenga tiempo para hacer un overclock adecuado :)
Archivos adjuntos:
 
Para información, GetTickCount tiene una tasa de error muy por debajo de los 16 ms, no es que estés usando Windows 95.
 
Mathemat:

fyords, ¿cómo has hecho para que los eventos anteriores aparezcan más arriba en el registro?

En los informes, botón derecho "Ver", nueva ventana botón "Consulta" y el registro se construye por el tiempo correctamente, y es más conveniente para leer (para mí).

En cuanto al script, gracias, lo probaré mañana, es una larga espera para su realización, sobre todo con Count pass = 12800.

Por ahora aquí hay un viejo script con Count pass = 12800

2012.06.01 01:05:53     ParallelTester_00-01 x (EURUSD,D1)       OpenCL init OK!
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       GPU time = 999 ms
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:05:54     ParallelTester_00-01 x (EURUSD,D1)       Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CPU time = 434167 ms
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Соunt inticators = 16; Count history bars = 144000; Count pass = 12800
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.01 01:13:08     ParallelTester_00-01 x (EURUSD,D1)       CpuTime/GpuTime = 434.6016016016016
La ganancia ha sido aún mayor.
 
Renat: Para información: GetTickCount tiene un error mucho menor que 16 ms, no estás usando Windows 95.

En realidad, el error no es mucho menor. Sí, cerca de ella, pero hay valores atípicos respecto a la media, que se agrupan en torno a 32, 48 e incluso más. Son raros, no discuto, se pueden ignorar.

Pero cuando una persona ejecuta un script, no está necesariamente haciendo nada en el ordenador. Y el sistema también puede ejecutar sus propias tareas, lo que puede ralentizar la ejecución.

Técnicamente, la desviación estándar es realmente pequeña, en torno a 6-7, y depende débilmente del propio tiempo de ejecución. Pero refleja mal la verdadera variación. Aquí hay un histograma de los tiempos registrados al realizar los mismos cálculos:

La distancia entre barras adyacentes es de 16ms. Las columnas más pequeñas son bastante probables, y se diferencian entre sí por tan sólo 32ms. Si la columna del medio ("tiempo de ejecución real") es de 140 milisegundos, la de la izquierda es de 124 ms y la de la derecha de 156 ms.

Por lo tanto, la variación real cuando se divide por el tiempo de ejecución de la GPU baja puede ser bastante grande:

20 segundos/124 ms ~ 161

20 segundos/156 ms ~ 128.

La "verdadera proporción" de los tiempos de ejecución corresponde aproximadamente a la barra más grande:

20 seg/140ms ~ 143.

Si tomamos un mayor tiempo de ejecución en la GPU, el impacto de este error será mucho menor. Por lo menos que sean 500ms.

Guión para la simulación:

#define BIG       10000000
#define SMALL     1000

void OnStart( )
{
   Print( "Script started..." );
   double k;
   int times[ SMALL ];
   MathSrand( TimeCurrent( ) );
   for( int ii = 0; ii < SMALL; ii ++ )
   {
      Comment( ii );
      int st = GetTickCount( );
      for( int i = 0; i < BIG; i ++ )   k = sin( i );
      int timeTotal = GetTickCount( ) - st;
      times[ ii ] = timeTotal;
   }

   int h = FileOpen( "gtc_times.txt", FILE_WRITE, "\r\n"  );
   for( int ii = 0; ii < SMALL; ii ++ )
      FileWrite( h, times[ ii ] );   
   FileClose( h ); 
   Print("Script unloaded");
}
//+------------------------------------------------------------------+