Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
An welchem Teil meines Codes sind Sie genau interessiert? Ich habe eine Menge Abhängigkeiten von verschiedenen Dateien.
Das Problem, das ich jetzt habe, ist nur das Schreiben und Lesen des Puffers in 1 Tick des Testers, und für die Überprüfung ist es genug:
Läuft nach Skript:
2013.10.30 18:55:40 OpenCL_buffer_test (EURUSD,H1) Gerät #0 = Cypress
2013.10.30 18:55:40 OpenCL_buffer_test (EURUSD,H1) OpenCL: GPU-Gerät 'Cypress' ausgewählt
2013.10.30 18:55:40 OpenCL_buffer_test (EURUSD,H1) build log =
2013.10.30 18:55:40 OpenCL_buffer_test (EURUSD,H1) Puffergröße in Bytes =240
Experte läuft im Tester vom 2013.01.09 bis 2013.10.10 auf M5 mit "OHLC auf M1":
2013.10.30 19:01:44 Kern 1 2013.01.09 00:00:00 Gerät #0 = Cypress
2013.10.30 19:01:44 Core 1 2013.01.09 00:00:00 OpenCL: GPU-Gerät 'Cypress' ausgewählt
2013.10.30 19:01:44 Core 1 2013.01.09 00:00:00 build log =
2013.10.30 19:01:44 Kern 1 2013.01.09 00:00:00 Puffergröße in Bytes =240
2013.10.30 19:04:55 Core 1 EURUSD,M5: 1108637 Ticks (55953 Balken) innerhalb von 192443 ms erzeugt (Gesamtbalken in der Historie 131439, Gesamtzeit 192521 ms)
2013.10.30 19:04:55 Kern 1 294 Mb Speicher verwendet
Beachten Sie, dass nur 1 Gerät im Tester vorhanden ist.
Wenn
//CLBufferRead(hbuffer[1], price);
dann
Wenn es notwendig ist, Berechnungen mit OHLC-Daten durchzuführen, ist es zwingend erforderlich, sparsam zu schreiben, d. h. einen größeren Puffer im Voraus anzulegen und diesen nur zu überschreiben, wenn neue Daten eintreffen, wobei dem Kernel der neue Beginn und die Größe des Puffers mitgeteilt werden.
Selbst wenn es uns gelingt, die OHLC-Übertragung zu optimieren (wir verwenden CLSetKernelArg, um den letzten Takt zu übertragen), werden wir beim Lesen des Ergebnispuffers abstürzen:
Und wer hindert Sie daran, das zu tun? Geh und schreibe etwas Reales, das kein Märchen ist. Versuchen Sie aber, ein Beispiel zu finden, damit eine Beschleunigung stattfindet. Dies ist der schwierigste Teil.
Wenn Sie von meinen Artikeln sprechen... Nun, ich habe eine Fibel geschrieben. Und die Matrixmultiplikation ist eine recht nützliche Operation.
P.S. Übrigens, wenn Ihre CPU von Intel ist, ist die Emulation von x86-Kernen auf ihr viel schneller als auf einer Konkurrenz-CPU. Das heißt, wenn Sie es pro Kern neu berechnen.
HD5850: im Grunde eine ziemlich anständige Karte, aber moderne Karten sind besser - nicht nur aufgrund von mehr Fliegen, sondern auch aufgrund von OpenCL-Optimierungen. So wird beispielsweise die Zugriffszeit auf den globalen Speicher erheblich reduziert.
P.P.S. OpenCL ist kein Allheilmittel; es ist ein brauchbares Werkzeug, das in einigen seltenen Fällen die Geschwindigkeit deutlich erhöhen kann. Und in anderen, nicht so bequemen Fällen ist die Beschleunigung nicht so beeindruckend - wenn es eine gibt.
Äh... Artikel über Geschwindigkeitssteigerungen mit OpenCL auf GPU haben sich als Märchen herausgestellt, da sie sich nicht wirklich mit realen Aufgaben befassen :(
Nein. Das Märchen ist, dass "jeder Algorithmus in OpenCL beschleunigt werden kann". Nicht jeder Algorithmus.
Der erste Thread zu OpenCL beschreibt sogar recht gut die Kriterien, die ein Algorithmus erfüllen muss, um das Potenzial zur Beschleunigung von OpenCL zu haben.
Viel Glück dabei.
Die Behauptung bezieht sich nicht auf die Berechnungsgeschwindigkeit - es gibt einen 2-fachen Geschwindigkeitszuwachs (0,02 ms gegenüber 0,05 ms).
Die Behauptung lautet, dass die Artikel keine Informationen enthalten:
Ich bin wahrscheinlich der erste, der den Test auf Kosten der GPU beschleunigen wollte, nachdem ich die Versprechen gelesen hatte...
Lesen Sie meinen Beitrag noch einmal.
Das Hauptkriterium: die Ausführung von MQL-Code im "OpenCL-Stil" sollte die Zeit = Number of_Buffers * 0,35300 ms in 1 Tick überschreiten.
Um die Geschwindigkeit des Algorithmus in MQL mit einer Genauigkeit von Mikrosekunden (1000 Mikrosekunden = 1 Millisekunde) zu ermitteln, müssen Sie ihn mehrmals im Tester und Total_Time / Number_of_Ticks (mein oberster Beitrag) ausführen.
Wäre die Pufferverzögerung nicht, würde mein Code den Test in ~30 Sekunden bestehen - das ist ~2 mal schneller als MQL im "OpenCL-Stil" (55 Sekunden) und ~11 mal schneller als normaler Code (320 Sekunden).
Welche anderen Kriterien gibt es?
Nach Ihrer Erfahrung im Umgang mit OpenCL zu urteilen, haben Sie sicher schon verstanden, dass nicht jeder Algorithmus direkt beschleunigt wird. Eines der Hauptprobleme dabei ist die Minimierung der globalen Speicherzugriffe.
Übrigens muss ich jetzt ein ähnliches Problem mit dem zufälligen Zugriff auf den globalen Gerätespeicher lösen (zu privat dieser zufällige Zugriff, und es ist ein verdammter Overhead). Ich werde das Problem lösen, sobald ich mein Gehirn wieder auf Vordermann gebracht habe.
Der Tester wählt die CPU nicht für OpenCL aus - dies wird nirgends gemeldet!
Schreiben Sie an den Service Desk und begründen Sie den Bedarf an einer solchen Funktion.
Wenn das Prüfgerät nicht verwendet wird, ist es bereits fertig (dies ist meine Anwendung). Und ich habe das Testgerät noch nicht überprüft.
Es wurde bereits geschrieben, dass nicht jeder Algorithmus direkt beschleunigt wird. Hier muss man seinen Verstand gebrauchen, und eines der Hauptprobleme besteht darin, die globalen Speicherzugriffe zu minimieren.
Nun, jetzt muss ich ein ähnliches Problem mit dem zufälligen Zugriff auf den globalen Speicher lösen (dieser zufällige Zugriff ist zu häufig). Ich werde das Problem lösen, sobald ich mein Gehirn eingeschaltet habe.
Es ist an der Zeit, Ihr Gehirn zu benutzen, denn 0,35300 ms bezieht sich genau auf clEnqueue[Read/Write]Buffer() und nicht auf globale Speicherzugriffe innerhalb des Kernels.
Das zweite Problem kann durch die Optimierung des Kernels selbst gelöst werden, während das erste eine eiserne Grenze darstellt.