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

 
joo:

Parece que sí.

No estoy seguro, porque intento no utilizar construcciones complicadas (difíciles de percibir a ojo), pero probablemente no debería, ya que puede acelerar el código.

Su código probablemente será más lento, porque la variable b se vuelve a declarar en cada iteración del bucle.

Mi código es más corto y más rápido de todos modos. Puede comprobar tanto la velocidad como la equivalencia
"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   int i = get_global_id(0);                               \r\n"
"   out[i]= i;                                              \r\n"
"  }                                                        \r\n"; //;-))
;-)
 
MetaDriver: De todos modos, mi código es más corto y rápido. Puedes comprobar tanto la velocidad como la equivalencia;-)
No, eso no es justo. Deberías manejar el código de Andrei y acelerarlo.
 
Mathemat:
No, eso no es justo. Manejas el código de Andrei y lo aceleras.

¿Qué he hecho?

¿Qué se le pide al optimizador? Reduciendo los gastos generales y manteniendo los resultados equivalentes. Así que compruébalo, todo suma un céntimo.

:)

// ¡¡¡Por cierto!!! ¡¡¡Este código no deja caer mi controlador incluso con #define BUF_SIZE 1024*1024*4 !!!

// ¡Esto es un avance!

;))))

 
MetaDriver:

¿Qué he hecho?

¿Qué se le pide al optimizador? Reduciendo los gastos generales y manteniendo los resultados equivalentes. Así que compruébalo, todo suma un céntimo.

:)

¿Sumó? ¿Cómo lo comprobaste? :O
 
joo:
¿Encaja? ¿Cómo lo has comprobado? :O
¡Cómo, cómo! ¡Con una calculadora! Puse ocho en paralelo y lo comprobé.
 
MetaDriver:
¡Cómo, cómo! ¡En la calculadora! Puse ocho en paralelo y lo comprobé.

Tu calculadora está mintiendo. :)

El ciclo suma 0+1+2+3+...+99999999. Y después de cada 10000 pasos el valor es 0.

¿Qué has hecho? - Se asigna un número de mosca y ya está. ¿Cómo pueden ser mis resultados los mismos que los tuyos?

 

He estado investigando un poco y he sospechado que este

"__kernel void MFractal(                                    \r\n"
"                       __global int *out                   \r\n"
"                      )                                    \r\n"
"  {                                                        \r\n"
"   out[get_global_id(0)]= get_global_id(0);                \r\n"
"  }                                                        \r\n";

Lo que pasa es que lo más probable es que get_global_id() no sea una función, sino una operación de registro súper rápida.

Si alguien lo necesita y quiere, por favor, comunique los resultados al estudio. le será útil.
 
MetaDriver:

¿Qué se le pide al optimizador? Reduciendo los gastos generales y manteniendo los resultados equivalentes. Así que compruébalo, todo suma un céntimo.

// ¡¡¡Por cierto!!! ¡¡¡Este código no deja caer mi controlador incluso con #define BUF_SIZE 1024*1024*4 !!!

Por otro lado - si el conductor no lo deja caer, la equivalencia en el resultado ya está incompleta.

Mierda... Qué pena. :(

 
MetaDriver: Por otro lado, como el conductor no lo deja caer, la equivalencia en el resultado ya es incompleta.

No, no has estado fumando bien.

1^3 + 2^3 + 3^3 + ... + 1000000000^3 = 1000000000^2 * (1000000000 + 1)^2 / 4

La izquierda y la derecha son la misma cosa, una equivalencia total.

Sólo con la expresión izquierda calentarás la piedra durante bastante tiempo, mientras que con la derecha será casi instantáneo, el procesador no lo notará y se mantendrá frío.

P.D. He actualizado a OpenCL 1.2 (es beta). Tenga en cuenta el pequeño añadido después del número de versión: sse2.

2012.03.22 07:43:28     Terminal        CPU: GenuineIntel  Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 7912 Mb, version 2.0 (sse2))

No quiere decir que haya mejorado drásticamente, pero se ha acelerado en algunas pruebas. Digamos, en Tast_Mand_ (bueno, eres un pervertido, Andrewha) - 5% a 10%. Sólo un poco, pero bien.

 
joo:

Tu calculadora está mintiendo. :)

El bucle suma 0+1+2+3+...+99999999. Y después de cada 10000 pasos el valor es 0.

¿Qué has hecho? - Se asigna un número de mosca y ya está. Entonces, ¿cómo pueden ser mis resultados los mismos que los tuyos?

Te di casi 24 horas para que entraras en razón. ¿Aún insistes? :)

Veamos:

// Это твой код (оригинал)
"  {                                \r\n"
"   int i = get_global_id(0);       \r\n"
"   for(int u=0;u<100000000;u++)   \r\n"
"   {                           \r\n"
"    out[i]+=u;              \r\n"  
"    if(out[i]>10000)     \r\n"
"      out[i]=0;         \r\n" // после десятитысячного шага итерации этот оператор начнёт выполняться в каждом цикле.
"   }                    \r\n" // т.е. на выходе из цикла по любому будем иметь out[i] = 0;
"   out[i]+= i;          \r\n" // ecли к нулю прибавить номер мухи то получится... сам посчитай..... на калькуляторе... :)
"  }                     \r\n";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))