OpenCL: test di implementazione interna in MQL5 - pagina 44

 
joo:

Sembra che sia così.

Non sono sicuro, perché cerco di non usare costruzioni complicate (difficili da percepire a occhio), ma probabilmente dovrebbe, perché può accelerare il codice.

Il vostro codice dovrebbe probabilmente essere più lento, perché la variabile b viene ridichiarata ad ogni iterazione del ciclo.

Il mio codice è comunque più corto e veloce. Puoi controllare sia la velocità che l'equivalenza
"__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: Il mio codice è comunque più breve e più veloce. Puoi controllare sia la velocità che l'equivalenza;-)
No, non è giusto. Dovresti gestire il codice di Andrei e velocizzarlo.
 
Mathemat:
No, beh, non è giusto. Lei gestisce il codice di Andrei e lo velocizza.

Cosa ho fatto?

Cosa è richiesto all'ottimizzatore? Ridurre le spese generali mantenendo i risultati equivalenti! Quindi controlla, tutto si aggiunge a un centesimo.

:)

// A proposito!!! Questo codice non fa cadere il mio driver anche con #define BUF_SIZE 1024*1024*4 !!!

// Questo è un passo avanti!

;))))

 
MetaDriver:

Cosa ho fatto?

Cosa è richiesto all'ottimizzatore? Ridurre le spese generali mantenendo i risultati equivalenti! Quindi controlla, tutto si aggiunge a un centesimo.

:)

I conti tornano, come hai controllato? :O
 
joo:
Ti sta bene? Come hai controllato? :O
Come, come, con una calcolatrice! Ne ho fatti correre otto in parallelo e ho controllato.
 
MetaDriver:
Come, come, sulla calcolatrice, ne ho fatti correre otto in parallelo e ho controllato.

La tua calcolatrice sta mentendo. :)

Il ciclo aggiunge 0+1+2+3+...+99999999. E dopo ogni 10000 passi il valore è 0.

Che cosa hai fatto? - Hai assegnato un numero di mosca e questo è tutto. Come possono i miei risultati essere uguali ai vostri?

 

Ho fatto un po' di ricerche e ho sospettato che questo

"__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";

Il fatto è che get_global_id() molto probabilmente non è una funzione, ma un'operazione di registro super veloce.

Se qualcuno ha davvero bisogno e vuole farlo - si prega di riportare i risultati allo studio. sarà utile.
 
MetaDriver:

Cosa è richiesto all'ottimizzatore? Ridurre le spese generali mantenendo i risultati equivalenti! Quindi controlla, tutto si aggiunge a un centesimo.

// A proposito!!! Questo codice non fa cadere il mio driver anche con #define BUF_SIZE 1024*1024*4 !!!

Ho fumato un po' di più e mi sono arrabbiato. D'altra parte - se il guidatore non lo fa cadere, l'equivalenza nel risultato è già incompleta.

Merda... Che sfortuna. :(

 
MetaDriver: Hai fumato più a lungo e ti sei arrabbiato. D'altra parte, dato che l'autista non lo fa cadere, l'equivalenza nel risultato è già incompleta.

No, non hai fumato bene.

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

Sinistra e destra sono la stessa cosa, equivalenza totale.

Solo con l'espressione di sinistra riscalderai la pietra per un tempo abbastanza lungo, mentre con quella di destra sarà quasi istantaneo, il processore non se ne accorgerà e rimarrà freddo.

P.S. Ho aggiornato a OpenCL 1.2 (è beta). Si prega di notare la piccola aggiunta dopo il numero di versione - 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))

Non per dire che è migliorato drasticamente, ma ha accelerato in alcuni test. Diciamo, su Tast_Mand_ (beh, sei un pervertito, Andrewha) - dal 5% al 10%. Solo un po', ma buono.

 
joo:

La tua calcolatrice sta mentendo. :)

Il ciclo aggiunge 0+1+2+3+...+99999999. E dopo ogni 10000 passi il valore è 0.

Che cosa hai fatto? - Hai assegnato un numero di mosca e questo è tutto. Quindi come possono i miei risultati essere uguali ai vostri?

Ti ho dato quasi 24 ore per rinsavire, insisti ancora? :)

Vediamo:

// Это твой код (оригинал)
"  {                                \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";// есть ещё вариант, надёжнее - распечатай результаты и сравни.  ;-)))