OpenCL: interne Implementierungstests in MQL5 - Seite 51

 
Mathemat:

Und das Ergebnis deines OpenCL-Emulators (dein zweiter Test) scheint verdächtig schwach zu sein, selbst im Vergleich zu meinem (ich hatte etwa 10 Sekunden auf "GPU").

Er rechnete mit einer CPU-intensiven GPU - ich hatte mehr Kerne als meine. Und meine zählte auf reine CPU mit 4 Kernen (Gerät 1).
 
joo: Sie haben mit einer CPU-intensiven GPU gerechnet, die mehr Kerne hat als meine. Und meine rechnete mit einer reinen CPU mit 4 Kernen.

Nö, nicht so, Andrei. Imho habe ich auch mit einer reinen CPU mit 2 Kernen gerechnet. Dafür gibt es drei Argumente. Der erste ist einfach unumstößlich, der zweite und dritte sind nicht so solide:

1. Ich habe nur ein OpenCL-Gerät auf meinem System. Andererseits muss eine dieser Festplatten ohnehin der Host sein, d. h. die bloße CPU. Das ist es. Es ist keine GPU, ich habe es mit GPU Caps überprüft.

Daher vermute ich, dass das CPU-Gerät, das OpenCL emuliert, jeder Stein sein könnte, der SSE2 und höher unterstützt. Dabei spielt es keine Rolle, ob es eine integrierte Grafikkarte hat oder nicht. Übrigens auch mit einem Intel Core i5-750.

2. Meine CPU-Grafik ist Intel HD Graphics. Er hat 6 Pipelines, aber 24 Prozessoren (Threads, Fliegen?). Kreisen Sie die Grafikspezifizierungen ein, die dem entsprechen, was Sie und ich haben.

Da die Flugfrequenz viel niedriger ist als die Steinfrequenz, kann ich mir nicht vorstellen, dass 24 GPU-Threads bei einer niedrigeren Frequenz die Ausführung im Vergleich zu einer reinen CPU um mehr als das 25-fache beschleunigen würden (und das habe ich schon erlebt). Damit bleibt nur noch eines übrig: Es liegt nicht an der GPU, sondern an der CPU-Emulation von OpenCL. Es kann sein, dass ich mich verzählt habe, aber ich habe keine genaueren Daten über die Grafikarchitektur der Intel-Steine.

Ihre eingebettete Grafik ist in etwa die gleiche wie meine - Intel HD Graphics 2000 - aber irgendetwas ist da oben schief. Ich weiß nicht, wie ich ein so seltsam niedriges Ergebnis eines fast erstklassigen Intel Sandy Bridge Steins erklären soll. Die Beschleunigung dürfte nach groben Schätzungen in der Größenordnung von 50 liegen.

3. Formal wird Intels eingebettete Grafik nur auf Ivy Bridge zusammen mit der Intel HD Graphics 2500 und 4000 OpenCL-Unterstützung haben (sie wird bereits 64 schnelle Fliegen haben, die viel schneller sind als die integrierten von AMD). Und im Moment scheint es sie wirklich nicht zu geben.

Ich selbst habe noch nicht herausgefunden, warum mein i3 meine Berechnungen nicht beschleunigt.

 
Mathemat:

...

Ich muss selbst noch herausfinden, warum mein i3 meine Berechnungen nicht beschleunigt.

Hurra! Es klappt!

2012.04.09 15:32:01 Terminal CPU: GenuineIntel Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz mit OpenCL 1.1 (4 Einheiten, 3092 MHz, 4008 Mb, Version 2.0)
2012.04.09 15:32:01 Terminal MetaTrader 5 x64 build 619 gestartet (MetaQuotes Software Corp.)

2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1) CpuTime/GpuTime = 2.604419002781939
2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1) Ergebnis auf Cpu MachResult==3.64642 bei 1594 pass
2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1) CPU-Zeit = 243409 ms
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1) Ergebnis auf Gpu MachResult==3.64642 bei 1594 pass
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1) GPU-Zeit = 93460 ms
2012.04.09 15:54:41 ParallelTester_00-02-316x7x3j (USDJPY,H1) OpenCL init OK!
2012.04.09 15:42:27 ParallelTester_00-02-316x7x3j (EURUSD,M1) CpuTime/GpuTime = 2.573211516347179
2012.04.09 15:42:27 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Cpu MachResult==3.82222 bei 3357 pass
2012.04.09 15:42:27 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 15:42:27 ParallelTester_00-02-316x7x3j (EURUSD,M1) CPU-Zeit = 243907 ms
2012.04.09 15:38:23 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Gpu MachResult==3.82222 bei 3357 pass
2012.04.09 15:38:23 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 15:38:23 ParallelTester_00-02-316x7x3j (EURUSD,M1) GPU-Zeit = 94787 ms
2012.04.09 15:36:49 ParallelTester_00-02-316x7x3j (EURUSD,M1) OpenCL init OK!

 
Ashes:

Juhu! Es funktioniert!

2012.04.09 15:32:01 Terminal CPU: GenuineIntel Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz mit OpenCL 1.1 (4 Einheiten, 3092 MHz, 4008 Mb, Version 2.0)
2012.04.09 15:32:01 Terminal MetaTrader 5 x64 build 619 gestartet (MetaQuotes Software Corp.)

2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1)CpuTime/GpuTime = 2.604419002781939

2012.04.09 16:00:18 ParallelTester_00-02-316x7x3j (USDJPY,H1) CPU-Zeit = 243409 ms
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1) Ergebnis auf Gpu MachResult==3.64642 bei 1594 pass
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 15:56:15 ParallelTester_00-02-316x7x3j (USDJPY,H1)GPU-Zeit = 93460 ms

Nun, das ist besser als 0.7 - zumindest ist es etwas schneller geworden. Was haben Sie also getan?

Obwohl... Sie ist sehr schwach. Auf meinem Pentium G840, etwa so:

2012.04.08 22:01:08 Terminal CPU: GenuineIntel Intel(R) Pentium(R) CPU G840 @ 2.80GHz mit OpenCL 1.2 (2 Einheiten, 2793 MHz, 8040 Mb, Version 2.0 (sse2))

2012.04.09 22:11:35 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)CpuTime/GpuTime = 26.0524992748719
2012.04.09 22:11:35 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1) Ergebnis auf Cpu MachResult==4.04242 bei 1775 pass
2012.04.09 22:11:35 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 22:11:35 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)CPU-Zeit = 269461 ms
2012.04.09 22:07:05 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1) Ergebnis auf Gpu MachResult==4.04242 bei 1775 pass
2012.04.09 22:07:05 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.09 22:07:05 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1)GPU-Zeit = 10343 ms
2012.04.09 22:06:55 ParallelTester_00-02-316x7x3j_080412 (EURUSD,H1) OpenCL init OK!

Halten Sie es für normal, dass ein preiswerter Stein einen leistungsfähigeren Stein desselben Unternehmens um fast eine Größenordnung übertrifft? Sie haben fast die gleiche Architektur, und der Befehlssatz des i3 ist zumindest nicht schlechter...

 
Mathemat:

Nun, es ist bereits besser als 0.7, zumindest eine gewisse Beschleunigung. Und was haben Sie getan?

Obwohl... es ist sehr schwach. Auf meinem Pentium G840 geht das so:

Was meinen Sie, ist es normal oder nicht, wenn ein preiswerter Stein einen leistungsfähigeren Stein desselben Unternehmens um fast eine Größenordnung übertrifft? Sie haben fast die gleiche Architektur, und der Befehlssatz des i3 ist zumindest nicht schlechter...

Ich habe den HD-Grafiktreiber aktualisiert und das neue AMD OpenCL SDK mit Englisch installiert.

Mein Vorschlag bezüglich des Leistungsunterschieds lautet wie folgt: verschiedene Versionen von OCL + anfangs haben Sie einen GPU- gegenüber einem CPU-Frequenzvorteil (vorausgesetzt, der GPU-Teil ist derselbe).

 
Ashes: Was den Leistungsunterschied betrifft, so nehme ich an: unterschiedliche Versionen von OCL + anfangs haben Sie einen GPU-Frequenzvorteil gegenüber der CPU (vorausgesetzt, der GPU-Teil ist derselbe).

Ich habe kein GPU OpenCL Gerät, lesen Sie meine Antwort an joo. Und Sie sollten auch keine haben (ich spreche von integrierten Grafiken). Alles läuft über reine Emulation auf CPU-Kernen. Ja, und der Frequenzvorteil beträgt höchstens das Zweifache, während sich die Leistung um eine ganze Größenordnung unterscheidet. Dies ist eine Diskrepanz.

Zweitens: Der Versionsunterschied hat keinen Einfluss auf die Leistung aller hier beschriebenen Tests. Und es war genauso schnell auf 1.1 (auf meinem G840).

 
Mathemat:

Ich habe kein GPU OpenCL Gerät, lesen Sie meine Antwort an joo. Und Sie sollten auch keine haben (ich spreche von integrierten Grafiken). Alles läuft auf reiner Emulation auf CPU-Kernen. Ja, und der Frequenzvorteil beträgt höchstens das Zweifache, während sich die Leistung um eine ganze Größenordnung unterscheidet. Dies ist eine Diskrepanz.

Zweitens: Der Versionsunterschied hat keinen Einfluss auf die Leistung aller hier beschriebenen Tests. Und es war genauso schnell auf 1.1 (auf meinem G840).

Sieht so aus, als hätten Sie recht. Ich habe mich zu früh gefreut. Nach der CPU-Last zu urteilen, sieht es so aus, als ob der GPU-Teil des Skripts auf 4 Kerne/Threads parallelisiert ist (CPU-Last 100 %), während der CPU-Teil praktisch auf einem Kern ausgeführt wird (25-30 %).

Es stellt sich also heraus, dass 4*0,7 (Overhead?) ~= 2,8 - GPU/CPU.

Es ist nicht klar, warum es einen solchen Unterschied zwischen Ihrem und meinem, außer dass AMD SDK nicht alle Funktionen von "jemand anderes" Hardware in x64-Version (Sie haben, soweit ich verstehe, x32). HD Graphics Treiber-Version (Intel Corporation, 14.02.2012, 8.15.10.2653).

Vergleich von G840 und i3-2100 von intel.com:

PS. Ups, ich habe die 8040Mb übersehen, die Sie haben (d.h. x32/x64 ist out).

 
Mathemat:

Zweitens hat der Versionsunterschied keinen Einfluss auf die Leistung aller hier veröffentlichten Tests. Und mit 1.1 war es genauso schnell (auf meinem G840).

OpenCL 1.2 brachte einen Zuwachs von etwa 10 % gegenüber 1.1:

2012.04.10 09:41:19 Terminal MetaTrader 5 x64 build 619 gestartet (MetaQuotes Software Corp.)
2012.04.10 09:41:19 Terminal CPU: GenuineIntel Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz mit OpenCL 1.1 (4 Einheiten, 3092 MHz, 4008 Mb, Version 2.0)

2012.04.10 09:41:30 ParallelTester_00-02-316x7x3j (EURUSD,M1) OpenCL init OK!
2012.04.10 09:43:04 ParallelTester_00-02-316x7x3j (EURUSD,M1) GPU-Zeit = 94365 ms
2012.04.10 09:43:04 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 09:43:04 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Gpu MachResult==3.52408 bei 1914 Durchlauf
2012.04.10 09:47:09 ParallelTester_00-02-316x7x3j (EURUSD,M1) CPU-Zeit = 244968 ms
2012.04.10 09:47:09 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 09:47:09 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Cpu MachResult==3.52408 bei 1914 Durchlauf
2012.04.10 09:47:09 ParallelTester_00-02-316x7x3j (EURUSD,M1) CpuTime/GpuTime = 2.595962486091242
2012.04.10 10:20:22 ParallelTester_00-02-316x7x3j (EURUSD,M1) OpenCL init OK!
2012.04.10 10:21:56 ParallelTester_00-02-316x7x3j (EURUSD,M1) GPU-Zeit = 93756 ms
2012.04.10 10:21:56 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 10:21:56 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Gpu MachResult==4.06735 bei 1519 pass
2012.04.10 10:25:58 ParallelTester_00-02-316x7x3j (EURUSD,M1) CPU-Zeit = 242426 ms
2012.04.10 10:25:58 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 10:25:58 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Cpu MachResult==4.06735 bei 1519 pass
2012.04.10 10 10:25:58 ParallelTester_00-02-316x7x3j (EURUSD,M1) CpuTime/GpuTime = 2.58571184775076


2012.04.10 11:33:50 PM Terminal MetaTrader 5 x64 build 619 gestartet (MetaQuotes Software Corp.)
2012.04.10 11:33:50 Terminal CPU: GenuineIntel Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz mit OpenCL 1.2 (4 Einheiten, 3092 MHz, 4008 Mb, Version 2.0 (sse2,avx))

2012.04.10 11:34:14 ParallelTester_00-02-316x7x3j (EURUSD,M1) OpenCL init OK!
2012.04.10 11:35:41 ParallelTester_00-02-316x7x3j (EURUSD,M1) GPU-Zeit = 86923 ms
2012.04.10 11:35:41 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 11:35:41 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Gpu MachResult==4.27665 bei 970 Pass
2012.04.10 11:39:48 ParallelTester_00-02-316x7x3j (EURUSD,M1) CPU-Zeit = 246965 ms
2012.04.10 11:39:48 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 11:39:48 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Cpu MachResult==4.27665 bei 970 Pass
2012.04.10 11:39:48 ParallelTester_00-02-316x7x3j (EURUSD,M1) CpuTime/GpuTime = 2.841192779816619
2012.04.10 11:47:50 ParallelTester_00-02-316x7x3j (EURUSD,M1) OpenCL init OK!
2012.04.10 11:49:18 ParallelTester_00-02-316x7x3j (EURUSD,M1) GPU-Zeit = 87610 ms
2012.04.10 11:49:18 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 11:49:18 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Gpu MachResult==4.43566 bei 781 Pass
2012.04.10 11:53:24 ParallelTester_00-02-316x7x3j (EURUSD,M1) CPU-Zeit = 245873 ms
2012.04.10 11:53:24 ParallelTester_00-02-316x7x3j (EURUSD,M1) Anzahl der Indikatoren = 16; Anzahl der historischen Balken = 50.000; Anzahl der Durchläufe = 4096
2012.04.10 11:53:24 ParallelTester_00-02-316x7x3j (EURUSD,M1) Ergebnis auf Cpu MachResult==4.43566 bei 781 Durchlauf
2012.04.10 11:53:24 ParallelTester_00-02-316x7x3j (EURUSD,M1) CpuTime/GpuTime = 2.806449035498231

 
Ich nehme an, dass wenn wir ein 2D/multidimensionales Array mit Daten an die GPU übergeben möchten, wir die Datendarstellung als Struktur verwenden und die Struktur übergeben können?
 
Ashes: OpenCL 1.2 brachte einen Zuwachs von etwa 10 % gegenüber 1.1:

Ja, das stimmt. Der Gewinn ist ohnehin unbedeutend, und zwar nicht um ein Vielfaches.

Der einzige Unterschied ist, dass AMD SDK nicht alle Funktionen auf "fremder" Hardware verwendet.

Diese Hypothese hatte ich anfangs auch.

Aber CPU OpenCL-Tests von GPU Caps Dienstprogramm alle passieren ganz anständig, ich habe es überprüft. Das Werkzeug ist im Anhänger, falls Sie es brauchen. Drehen Sie einfach die CPU-Emulationen.

In einigen Tests sind die fps auf dem i3 um ein Vielfaches höher als auf dem G840 (beim 4D Quaternion Julia Set - etwa 17 gegenüber 4-5).

Es zeigt sich also, dass AMD hier gute Arbeit geleistet hat.

Das Problem liegt im Terminal, das aus irgendeinem Grund "versteht" G840 aber "nicht verstehen" kühleren Intel Steine mit AMD APP SDK installiert. Ich habe vor einer Woche eine Nachricht an servicedesk geschickt, aber bis jetzt keine Antwort erhalten.

Dateien: