OpenCL: interne Implementierungstests in MQL5 - Seite 29

 
MetaDriver:

...

--

Machen Sie 512 und sehen Sie, was Sie bekommen. Haben Sie keine Angst, das Programm zu knacken, es wird dadurch nur noch besser. :) Wenn Sie es getan haben, posten Sie es hier.

OK! Bei 512 Durchgängen und 144000 Takten:

PK      0       po_00-02 (GBPJPY,M5)    23:38:29        OpenCL init OK.
LS      0       po_00-02 (GBPJPY,M5)    23:38:30        Generation 001 (512 passes, 1186 ms) : MaxResult==81.21127; Average Result==24.14348
PR      0       po_00-02 (GBPJPY,M5)    23:38:32        Generation 002 (512 passes, 1170 ms) : MaxResult==88.56933; Average Result==45.67882
RF      0       po_00-02 (GBPJPY,M5)    23:38:33        Generation 003 (512 passes, 1170 ms) : MaxResult==100.78146; Average Result==66.20171
RF      0       po_00-02 (GBPJPY,M5)    23:38:34        Generation 004 (512 passes, 1170 ms) : MaxResult==107.30714; Average Result==82.67181
RG      0       po_00-02 (GBPJPY,M5)    23:38:35        Generation 005 (512 passes, 1170 ms) : MaxResult==115.61784; Average Result==93.52664
DG      0       po_00-02 (GBPJPY,M5)    23:38:36        Generation 006 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==100.41042
CG      0       po_00-02 (GBPJPY,M5)    23:38:37        Generation 007 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==103.95667
JF      0       po_00-02 (GBPJPY,M5)    23:38:39        Generation 008 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==105.85167
NI      0       po_00-02 (GBPJPY,M5)    23:38:40        Generation 009 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.22531
MI      0       po_00-02 (GBPJPY,M5)    23:38:41        Generation 010 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.33067
GH      0       po_00-02 (GBPJPY,M5)    23:38:42        Generation 011 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.23798
DK      0       po_00-02 (GBPJPY,M5)    23:38:43        Generation 012 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==106.02062
PK      0       po_00-02 (GBPJPY,M5)    23:38:44        Generation 013 (512 passes, 1170 ms) : MaxResult==116.37332; Average Result==105.62199
CJ      0       po_00-02 (GBPJPY,M5)    23:38:44        Optimization finished. Best result == 116.37332 at 13 generation.
RM      0       po_00-02 (GBPJPY,M5)    23:38:44        Total time of optimization == 15 sec 226 ms

Na ja, und wenn 60 optimal ist, dann ist das im Allgemeinen in Ordnung:

FG      0       po_00-02 (GBPJPY,M5)    23:39:44        OpenCL init OK.
OO      0       po_00-02 (GBPJPY,M5)    23:39:44        Generation 001 (60 passes, 312 ms) : MaxResult==91.27985; Average Result==38.30907
RN      0       po_00-02 (GBPJPY,M5)    23:39:44        Generation 002 (60 passes, 312 ms) : MaxResult==94.08679; Average Result==48.68662
DR      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 003 (60 passes, 296 ms) : MaxResult==108.52215; Average Result==58.43468
IS      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 004 (60 passes, 312 ms) : MaxResult==129.80438; Average Result==65.32684
DP      0       po_00-02 (GBPJPY,M5)    23:39:45        Generation 005 (60 passes, 297 ms) : MaxResult==144.99834; Average Result==73.78468
MQ      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 006 (60 passes, 297 ms) : MaxResult==144.99834; Average Result==79.96281
QF      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 007 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==85.70296
EG      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 008 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==87.95421
PD      0       po_00-02 (GBPJPY,M5)    23:39:46        Generation 009 (60 passes, 296 ms) : MaxResult==152.74852; Average Result==89.29836
CE      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 010 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==87.88991
OI      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 011 (60 passes, 296 ms) : MaxResult==152.74852; Average Result==85.3231
HK      0       po_00-02 (GBPJPY,M5)    23:39:47        Generation 012 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==81.60567
IH      0       po_00-02 (GBPJPY,M5)    23:39:48        Generation 013 (60 passes, 297 ms) : MaxResult==152.74852; Average Result==77.38504
QI      0       po_00-02 (GBPJPY,M5)    23:39:48        Generation 014 (60 passes, 312 ms) : MaxResult==152.74852; Average Result==76.46695
EM      0       po_00-02 (GBPJPY,M5)    23:39:48        Optimization finished. Best result == 152.74852 at 14 generation.
PO      0       po_00-02 (GBPJPY,M5)    23:39:48        Total time of optimization == 4 sec 290 ms

//---

Das heißt, auf dem schwächsten Laptop, der in diesem Thread vorgestellt wurde, ist dies das Ergebnis. Das ist sehr vielversprechend.

//---

Leider bin ich nicht in der Lage, das Thema frei zu diskutieren, da ich mich noch nicht einmal mit dem Joo-Artikel und den neuronalen Netzen beschäftigt habe, während ich mich nie mit OpenCL beschäftigt habe. Ich kann diesen oder jenen Code nicht verwenden, ohne jede einzelne Zeile des Codes zu verstehen. Ich möchte alles wissen. ))) Ich arbeite noch an der Engine des Handelsprogramms. Es gibt so viel zu tun, dass mir schon jetzt der Kopf schwirrt. )))

 

Ich habe die Anzahl der Balken um den Faktor 30 erhöht (auf 4.320.000) und beschlossen, die Belastbarkeit des Steins zu überprüfen.

Das macht nichts: Es funktioniert, es wird warm, aber es schwitzt nicht zu sehr. Die Temperatur steigt langsam an, hat aber bereits die Sättigung erreicht.

Die rote Linie ist die Temperatur, die grüne Linie ist die Belastung der Kerne.


Deshalb liebe ich Intels Sandy Bridge-Exemplar: Es ist "grün". Ja, die Grafik ist nicht großartig, aber wir werden sehen, was aus Ivy Bridge wird...
 
Mathemat:

...

Deshalb liebe ich Intels Sandy Bridge-Modell: Es ist "grün". Ja, die Grafik ist nicht toll, aber wir werden sehen, was aus Ivy Bridge wird...

Oh. (kichert) Das ist ein echter Stresstest. :) Meiner wäre jetzt wahrscheinlich schon tot.

Dann ein Haswell und etwas später ein Rockwell... )))

 

Ein Beispiel für eine Barnsley-Farn-Implementierung in OpenCL.

Die Berechnung basiert auf dem Chaos-Game-Algorithmus(Beispiel) und verwendet einen Zufallszahlengenerator mit einer Generierungsbasis, die von der Thread-ID abhängt und get_global_id(0) zurückgibt, um eindeutige Trajektorien zu erstellen.

IFS fern OpenCL

Bei der Skalierung steigt die Anzahl der Punkte, die zur Aufrechterhaltung der Bildqualität erforderlich sind, quadratisch an. Daher geht diese Implementierung davon aus, dass jede Kernelinstanz eine feste Anzahl von Punkten zeichnet, die in den sichtbaren Bereich fallen.

Die Anzahl der geschätzten Fäden wird in Zeile 191 angegeben:

   uint  work  []={500};

die Anzahl der Punkte steht in Zeile 233:

   float pointsneeded=float(MathRound(1500+scale));

UPD

IFS-fern.mq5 - CPU analog

Bei Maßstab=1000:


Chaos game - Wikipedia, the free encyclopedia
Chaos game - Wikipedia, the free encyclopedia
  • en.wikipedia.org
In mathematics, the term chaos game, as coined by Michael Barnsley,1 originally referred to a method of creating a fractal, using a polygon and an initial point selected at random inside it.2 The fractal is created by iteratively creating a sequence of points, starting with the initial random point, in which each point in the sequence is a...
Dateien:
 
Wunderschön.
 

Ich habe drei Schichten von 16x7x3 Neuronen gemacht. Eigentlich habe ich es vorgestern gemacht, heute debuggt. Davor passten die Ergebnisse nicht, wenn ich sie mit der CPU überprüfte - ich werde hier nicht die Gründe beschreiben, warum, zumindest nicht jetzt - ich bin zu müde. :)

Zeitliche Merkmale :

2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  CpuTime/GpuTime = 776.72 18045112782
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Result on Cpu МахResult==1.06443 at 1004 pass
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 04:46:13 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  CPU time = 206608 ms
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Result on Gpu МахResult==1.06443 at 1004 pass
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 04:42:46 ParallelTester_00-02-(16 x7x3) (EURUSD,M30)  GPU time = 266 ms

Morgen werde ich einen Optimierer für dieses Gitter erstellen. Dann werde ich mich damit beschäftigen, reale Daten zu laden und den Tester mit realistischen Berechnungen, die mit dem MT5-Tester überprüfbar sind, fertigzustellen. Dann werde ich mich mit dem Generator MLP+cl-Codes von Gittern für deren Optimierung beschäftigen.

Ich veröffentliche den Quellcode nicht, weil ich gierig bin, aber ex5 ist für diejenigen enthalten, die es auf ihrer Hardware testen möchten.

 
MetaDriver: Aus Gier lade ich den Quellcode nicht hoch, aber für diejenigen, die es auf ihrer Hardware testen wollen, ist ex5 beigefügt.

Ich bin so stabil, wie ich es unter Putin war:

2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CpuTime/GpuTime = 24.08037178786222
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Cpu МахResult==1.09311 at 771 pass
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CPU time = 176172 ms
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Gpu МахResult==1.09311 at 771 pass
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    GPU time = 7316 ms
2012.03.08 05:35:18    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    OpenCL init OK!


Übrigens, Achtung: Bei der CPU-Laufzeit ist der Unterschied zwischen Ihrem System und meinem (basierend auf einem Pentium G840) nicht so groß.

Ist Ihr RAM schnell? Ich habe 1333 MHz.

Und noch etwas: Es ist interessant, dass beide Kerne der CPU während der Berechnungen belastet werden. Der starke Belastungsabfall am Ende liegt nach dem Ende der Berechnungen. Was würde das bedeuten?


 
Mathemat:

Ich bin so stabil wie unter Putin:

2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CpuTime/GpuTime = 24.08037178786222
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Cpu МахResult==1.09311 at 771 pass
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:38:22    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    CPU time = 176172 ms
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Result on Gpu МахResult==1.09311 at 771 pass
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    Соunt inticators = 16; Count history bars = 144000; Count pass = 1024
2012.03.08 05:35:26    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    GPU time = 7316 ms
2012.03.08 05:35:18    ParallelTester_00-02-j16x7x3z (EURUSD,H1)    OpenCL init OK!


1. übrigens, beachten Sie den Unterschied zwischen Ihrem System und meinem (Pentium G840-basiert) in der CPU-Ausführungszeit.

2. ist Ihr RAM schnell? Ich habe 1333 MHz.

1. ich habe in meiner Freizeit meine Übertaktung wiederhergestellt. Ich hatte einmal einen wirklich schlimmen Absturz (ich fand später heraus, dass sich das Netzkabel der Festplatte aus dem Steckplatz gelöst hatte), also drückte ich auf der Suche nach einem Wunder die "MemoryOK"-Taste auf dem Motherboard. Danach funktionierte er immer noch nicht, nur die CMOS-Einstellungen wurden auf die Standardwerte zurückgesetzt. Jetzt habe ich den Prozessor wieder auf 3840 MHz übertaktet, also funktioniert er jetzt besser.

2. Ich kann es immer noch nicht herausfinden. :) Insbesondere der Benchmark, zu dem Renat den Link gezeigt hat, zeigt 1600MHz. Das Windows zeigt sogar 1033MHz an :)))), trotz der Tatsache, dass der Speicher selbst 2GHz ist, aber meine Mutter kann bis zu 1866 (bildlich) ziehen.

 
Mathemat:

Eine weitere Sache: Es ist interessant, dass ich beide Kerne belastet habe, wenn ich auf der CPU rechne. Der starke Belastungsabfall am Ende liegt nach dem Ende der Berechnungen. Was würde das bedeuten?

Vielleicht liegt es also gar nicht an der GPU? Der Treiber läuft, aber... Meine einzige Erklärung ist, dass die Berechnung auf CPU-OpenCL durchgeführt wird, natürlich nur auf allen verfügbaren Kernen und unter Verwendung von SSE-Vektorbefehlen. :)

Ich weiß nicht, wie diese (CPU-LPU) Unterstützung durch den Treiber implementiert ist, aber prinzipiell schließe ich auch eine solche Variante des opentzl-Verarbeitungsstarts nicht aus.

Dies ist allenfalls eine Spekulation von mir. Oder wie es jetzt in Mode ist - "IMHO" zu schreiben. ;)

 
MetaDriver: Die einzige Erklärung, die ich habe, ist, dass die Berechnung auf einer OpenCL-CPU durchgeführt wird, die natürlich alle verfügbaren Kerne und Vektor-SSE-Anweisungen verwendet. :)

Das bezweifle ich. Vor allem, weil ich nur zwei Kerne habe. Woher kommt dann der 25-fache Gewinn?

Wenn Sie Intel Math Kernel Library oder Intel Performance Primitives haben (ich habe sie nicht heruntergeladen), ist es möglich... in einigen Fällen. Aber das ist unwahrscheinlich, denn sie wiegen Hunderte von Meg.

Ich muss abwarten, was Google dazu zu sagen hat.

Mathematik: Interessanterweise sind bei meinen CPU-Berechnungen auch beide Kerne belastet.

Nein, ich meinte reine CPU-Berechnungen ohne OpenCL. Die Last liegt knapp unter 100 %, wobei jeder Kern vergleichbare Lastwerte aufweist. Bei der Ausführung von OpenCL-Code steigt sie jedoch auf 100 % an, was sich leicht durch den GPU-Betrieb erklären lässt.