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 .....
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.
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.
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.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) OpenCL init OK!
2012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) GPU time = 141 ms
2012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 12802012.05.3122:05:11 ParallelTester_00-01 x (EURUSD,D1) Result on Gpu МахResult==1.28051 at 1213 pass
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) CPU time = 43259 ms
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 12802012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) Result on Cpu МахResult==1.28051 at 1213 pass
2012.05.3122:05:54 ParallelTester_00-01 x (EURUSD,D1) CpuTime/GpuTime = 306.8014184397163
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.3115:48:35 OpenCL CPU: GenuineIntel Intel(R) Pentium(R) CPU G840 @ 2.80 GHz with OpenCL 1.2 (2 units, 2793 MHz, 8040 Mb, version2.0 (sse2))
2012.05.3115: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.3115: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, version1.1)
Die Skriptergebnisse sind von unten nach oben!
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 24.769437551695622012.06.0101:06:12 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 9672 ms
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 22012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 204.76068376068382012.06.0101:06:02 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 1170 ms
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 12012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) ------------
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Gpu МахResult==0.87527 at 10902 pass
2012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CpuTime/GpuTime = 77.555843314988662012.06.0101:06:01 ParallelTester_00-01 x_new_cycle (EURUSD,H1) GPU time = 3089 ms
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Device number = 02012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) -------------------------
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Result on Cpu МахResult==0.87527 at 10902 pass
2012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) Соunt indicators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:05:57 ParallelTester_00-01 x_new_cycle (EURUSD,H1) CPU time = 239570 ms
2012.06.0101: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 :)
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.0101:05:53 ParallelTester_00-01 x (EURUSD,D1) OpenCL init OK!
2012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) GPU time = 999 ms
2012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:05:54 ParallelTester_00-01 x (EURUSD,D1) Result on Gpu МахResult==1.49697 at 10010 pass
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) CPU time = 434167 ms
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) Соunt inticators = 16; Count history bars = 144000; Count pass = 128002012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) Result on Cpu МахResult==1.49697 at 10010 pass
2012.06.0101:13:08 ParallelTester_00-01 x (EURUSD,D1) CpuTime/GpuTime = 434.6016016016016
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 1000voidOnStart( )
{
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");
}
//+------------------------------------------------------------------+
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
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.
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.
Verstehen von OpenCL, Vorbereitung eines Aufgabentests für Cloud+OpenCL. Sehr interessante mathematische Perspektiven.
Das ist eher etwas für MetaDriver........................
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.
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):
Die Skriptergebnisse sind von unten nach oben!
Bei dem letztgenannten Parameter, der 10x niedriger ist, ist meine Karte nicht so schnell wie Ihre. Wahrscheinlich hat er keine Zeit, richtig zu übertakten :)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
Der Gewinn ist noch größer geworden.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: