OpenCL: interne Implementierungstests in MQL5 - Seite 44

 
joo:

Es sieht so aus.

Ich bin mir nicht sicher, weil ich versuche, keine kniffligen Konstruktionen zu verwenden (mit dem Auge schwer zu erkennen), aber wahrscheinlich sollte ich es nicht tun, da es den Code beschleunigen kann.

Ihr Code sollte wahrscheinlich langsamer sein, da die Variable b bei jeder Schleifeniteration neu deklariert wird.

Mein Code ist ohnehin kürzer und schneller. Sie können sowohl die Geschwindigkeit als auch die Gleichwertigkeit prüfen
"__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: Mein Code ist ohnehin kürzer und schneller. Sie können sowohl die Geschwindigkeit als auch die Gleichwertigkeit prüfen;-)
Nein, das ist nicht fair. Sie sollten Andrei's Code bearbeiten und ihn beschleunigen.
 
Mathemat:
Nein, das ist nicht fair. Sie bearbeiten Andrei's Code und beschleunigen ihn.

Was habe ich getan?

Welche Anforderungen werden an den Optimierer gestellt? Weniger Overhead bei gleichbleibenden Ergebnissen! Schauen Sie sich das an, es macht alles zusammen einen Cent aus.

:)

// Übrigens !!! Dieser Code wirft meinen Treiber nicht ab, auch nicht mit #define BUF_SIZE 1024*1024*4 !!!

// Das ist ein Durchbruch!

;))))

 
MetaDriver:

Was habe ich getan?

Welche Anforderungen werden an den Optimierer gestellt? Geringerer Aufwand bei gleichbleibenden Ergebnissen! Schauen Sie sich das an, es macht alles zusammen einen Cent aus.

:)

Wie haben Sie das überprüft? :O
 
joo:
Passt er? Wie haben Sie das überprüft? :O
Wie, wie, mit einem Taschenrechner! Ich habe acht davon parallel geschaltet und überprüft.
 
MetaDriver:
Ich habe acht davon parallel geschaltet und überprüft.

Ihr Taschenrechner lügt. :)

Der Zyklus addiert 0+1+2+3+...+99999999. Und nach jeweils 10000 Schritten ist der Wert 0.

Was haben Sie getan? - Sie haben eine Flugnummer vergeben und das war's. Wie können meine Ergebnisse die gleichen sein wie Ihre?

 

Ich habe ein wenig recherchiert und vermutet, dass diese

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

Die Sache ist die, dass get_global_id() höchstwahrscheinlich keine Funktion ist, sondern eine superschnelle Registeroperation.

Wenn jemand braucht und will, bitte melden Sie die Ergebnisse an das Studio. es wird nützlich sein.
 
MetaDriver:

Welche Anforderungen werden an den Optimierer gestellt? Weniger Overhead bei gleichbleibenden Ergebnissen! Schauen Sie sich das an, es macht alles zusammen einen Cent aus.

// Übrigens !!! Dieser Code wirft meinen Treiber nicht ab, auch nicht mit #define BUF_SIZE 1024*1024*4 !!!

Ich habe ein bisschen länger geraucht und mich geärgert. Andererseits - wenn der Fahrer es nicht fallen lässt, ist die Gleichwertigkeit im Ergebnis schon unvollständig.

Verdammt... So ein Pech :(

 
MetaDriver: Sie haben länger geraucht und sich aufgeregt. Andererseits ist die Gleichwertigkeit im Ergebnis bereits unvollständig, da der Fahrer sie nicht fallen lässt.

Nein, du hast nicht gut geraucht.

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

Links und rechts sind ein und dasselbe, völlig gleichwertig.

Nur mit dem linken Ausdruck wird der Stein ziemlich lange erhitzt, während es mit dem rechten fast augenblicklich geschieht, der Prozessor merkt es nicht und bleibt kalt.

P.S. Ich habe auf OpenCL 1.2 aktualisiert (es ist Beta). Bitte beachten Sie den kleinen Zusatz nach der Versionsnummer - 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))

Ich will nicht sagen, dass es sich dramatisch verbessert hat, aber es hat sich bei einigen Tests beschleunigt. Sagen wir, auf Tast_Mand_ (ja, du bist ein Perverser, Andrewha) - 5% bis 10%. Nur ein bisschen, aber gut.

 
joo:

Ihr Taschenrechner lügt. :)

Die Schleife addiert 0+1+2+3+...+99999999. Und nach jeweils 10000 Schritten ist der Wert 0.

Was haben Sie getan? - Sie haben eine Flugnummer vergeben und das war's. Wie können also meine Ergebnisse mit den Ihren übereinstimmen?

Ich habe Ihnen fast 24 Stunden Zeit gegeben, zur Vernunft zu kommen. Bestehen Sie immer noch darauf? :)

Schauen wir mal:

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