OpenCL: interne Implementierungstests in MQL5 - Seite 64

 

http://www.ixbt.com/video3/rad2.shtml- Es ist am besten, optimierte Bibliotheken für große Datenmengen zu verwenden, anstatt beim Schreiben von Programmen in OpenCL "kreativ" zu werden (ich schließe das nicht aus). Sie können ein hybrides System verwenden, bei dem kleine Mengen mitOpenCL und große Mengenmit optimierten Bibliotheken verarbeitet werden.Möglicherweise müssen Sie die Bibliothek in eine bestimmte Programmiersprache konvertieren und Bedingungen für die Aufnahme dieser Bibliothek schaffen. Wenn dies umgesetzt werden kann, würde es zu einem beeindruckenden Ergebnis führen und somit die Operation um ein Vielfaches beschleunigen. Hinweis an .....

P.S Dies könnte ein neues Thema im Forum sein

������������������ AMD Radeon � �������������� �����������. ������������� AMD Core Math Library
  • www.ixbt.com
������� ������� ����������� �� �������, ��������� ����������� � ���� � �� �� �����, �� ������ ��� �� ����� ������. � ������� ������������ ������� �� ����� ����������� �� ����� �������, � �������� GPU ����� ����� ������������� �������� ��������� ������� ��������� ���� � ����� ����� �� ����� �����. � ���� ����� ������ ���������� ��� PC ����� x86...
 
GKS: Es kann notwendig sein, Bibliotheken in eine bestimmte Programmiersprache zu konvertieren und Bedingungen zu schaffen, um diese Bibliothek zu aktivieren. Wenn dies möglich ist, werden Sie ein beeindruckendes Ergebnis erhalten und die Operation wird dadurch um ein Vielfaches beschleunigt.

Es ist nicht technologisch, wenn Entwickler den Compiler speziell für ein extrem spezifisches, wenn auch einzigartiges Produkt optimieren.

Und bis jetzt habe ich noch keine Händleraufgaben gesehen, die eine so große Anzahl von multiplizierten Matrizen erfordern.

 
MetaQuotes:

Ankündigung des MetaTrader 5 Updates

Ein Update der MetaTrader 5 Plattform wird in den nächsten Tagen veröffentlicht werden. Sobald das Update veröffentlicht ist, wird eine weitere Nachricht mit der endgültigen Liste der Änderungen und Build-Nummern veröffentlicht. Die folgenden Änderungen sind geplant:

MetaTrader 5 Kunden-Terminal Build 648

MetaTester: Unterstützung für die Verwendung von OpenCL-Programmen in Testagenten hinzugefügt.

Diejenigen, die OpenCL verstehen, bereiten einen Aufgabentest unter Cloud+OpenCL vor. Sehr interessante mathematische Perspektiven.
 
hrenfx: Verstehen von OpenCL, Vorbereitung eines Aufgabentests für Cloud+OpenCL. Sehr interessante mathematische Perspektiven.
Dies ist mehr für MetaDriver. Er ist hier ein großer OpenCL-Spezialist und versucht, die Tests zu emulieren.
 
hrenfx:
Verstehen von OpenCL, Vorbereitung eines Aufgabentests für Cloud+OpenCL. Sehr interessante mathematische Perspektiven.
Mathemat:
Das ist eher etwas für MetaDriver........................
Ich werde darüber nachdenken. Ich brauche ein paar Ideen, was genau berechnet werden muss.
 

Kürzlich aktualisierter Grafiktreiber (NVIDIA301.42).

Ich habe aus Interesse einen der alten Tests durchgeführt (ParallelTester_00-01x) und konnte meinen Augen nicht trauen.

Auf Seite 24 habe ich einen Test gemacht, und es waren 29, dann habe ich den Speicher auf 2-Kanal-Modus eingestellt, und er ging auf 39.

Jetzt sind 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)
Erstaunlich. Es scheint, dass NVIDIA die Treiber menschlich optimiert hat.
 

fyords, wie haben Sie dafür gesorgt, dass frühere Ereignisse im Protokoll weiter oben erscheinen?

Aber im Allgemeinen ist es großartig, ich verstehe dich. Ich war genauso glücklich, als ich meine HD 4870 günstig kaufte und ihre Leistung sah.

Eine kleine Empfehlung: Wählen Sie die Parameter so, dass die GPU-Ausführungszeit mit 1 Sekunde vergleichbar ist. Dann wird auch das Zeitverhältnis genauer sein. Der durchschnittliche Fehler der Funktion GteTickCount() beträgt nicht weniger als einige zehn Millisekunden. Sie könnten also leicht 120 ms oder 170 ms auf der GPU erreichen. Und davon hängt der Wert der Beschleunigung stark ab.

Ich habe dieses Skript ein wenig verfeinert, damit es auf allen verfügbaren Geräten läuft (siehe von unten nach oben: 1) CPU auf Intel-Plattform, dann 2) HD 4870 auf AMD-Plattform und 3) CPU auf AMD-Plattform):

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)

Die Skriptergebnisse sind von unten nach oben!

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)     ========================================
Bei dem letztgenannten Parameter, der 10x niedriger ist, ist meine Karte nicht so schnell wie Ihre. Wahrscheinlich hat er keine Zeit, richtig zu übertakten :)
 
Zur Information: GetTickCount hat eine Fehlerrate von deutlich unter 16 ms, es ist ja nicht so, als ob Sie Windows 95 verwenden würden.
 
Mathemat:

fyords, wie haben Sie dafür gesorgt, dass frühere Ereignisse im Protokoll weiter oben erscheinen?

In Berichten, rechte Taste "Ansicht", neues Fenster "Query"-Taste und das Protokoll wird durch die Zeit richtig gebaut, und es ist bequemer zu lesen (für mich).

Was das Skript angeht, danke, ich werde es morgen ausprobieren, es ist eine lange Wartezeit für seine Fertigstellung, vor allem mit Count pass = 12800.

Hier ist zunächst ein altes Skript mit 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
Der Gewinn ist noch größer geworden.
 
Renat: Zur Information: GetTickCount hat einen Fehler viel weniger als 16 ms, Sie verwenden nicht Windows 95.

Der Fehler ist tatsächlich nicht viel geringer. Ja, fast, aber es gibt Ausreißer vom Durchschnitt, die sich um 32, 48 und noch mehr gruppieren. Sie sind selten, ich behaupte nicht, sie können ignoriert werden.

Aber wenn eine Person ein Skript ausführt, tut sie nicht unbedingt etwas auf dem Computer. Und das System kann auch eigene Aufgaben ausführen, was die Ausführung verlangsamen kann.

Technisch gesehen ist die Standardabweichung sehr gering - etwa 6-7 - und hängt nur schwach von der Ausführungszeit selbst ab. Aber sie spiegelt die tatsächliche Variation nur unzureichend wider. Hier ist ein Histogramm der Zeiten, die bei der Durchführung der gleichen Berechnungen aufgezeichnet wurden:

Der Abstand zwischen benachbarten Balken beträgt 16 ms. Kleinere Spalten sind durchaus wahrscheinlich, und sie unterscheiden sich voneinander nur um 32 ms. Wenn die mittlere Spalte ("wahre Ausführungszeit") 140 Millisekunden beträgt, dann ist die linke Spalte 124 ms und die rechte 156 ms.

Die tatsächliche Abweichung, geteilt durch die geringe GPU-Ausführungszeit, kann also recht groß sein:

20 Sekunden/124 ms ~ 161

20 Sekunden/156 ms ~ 128.

Das "wahre Verhältnis" der Ausführungszeiten entspricht ungefähr dem größten Balken:

20 sec/140ms ~ 143.

Wenn wir eine längere Ausführungszeit auf der GPU nehmen, sind die Auswirkungen dieses Fehlers viel geringer. Zumindest sollten es 500ms sein.

Skript für die Simulation:

#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");
}
//+------------------------------------------------------------------+