Tuesday 14 February 2017

Moving Average Opencl

Durch die Beispiele und den Quellcode von Fixstars. Insbesondere versuche ich das letzte Bit des Codes in Kapitel 5 (zwei gleitende Durchschnitte - alias Goldenes Kreuz): Der Code ist hier verfügbar: Ill post das spezifische Beispiel unten. Aber das ist nur der Fall, wenn man die Befehlswarteschlange folgendermaßen einrichtet: clCreateCommandQueue (context, deviceid, CLQUEUEOUTOFORDEREXECMODEENABLE, ampret) führt zu einem ungültigen commandqueue (clError). Die Rückgabedaten werden also nicht korrekt verarbeitet. IE. Seine ganzen Nullen. Allerdings, wenn ich den Code, um nur einen gleitenden Durchschnitt zu berechnen, ohne CLQUEUEOUTOFORDEREXECMODEENABLE dann die Dinge funktionieren. Entsprechend scheint der Fixstars-Code vor diesem Kapitel alles gut zu funktionieren. Im, das an einem nagelneuen MacBook Pro (Netzhaut) arbeitet, das den NVIDIA Span hat. Also frage mich, ob seine einige Problem mit NVIDIAs Umsetzung oder einen anderen Aspekt. Ungeachtet dessen ist es ein Show-Stopper für mich als das, was Im schließlich versuchen zu tun ist Feuer aus mehreren (identischen) Prozesse mit verschiedenen Parametern, im Wesentlichen das gleiche, was dieses Beispiel versucht, indem sie zwei Aktienkurs gleitende Durchschnitte gleichzeitig zu tun. Code-Snippets unten. Ive hinzugefügt eine Debug-Ausdruck-Funktion zu ihrer Quelle. So sehe ich die folgenden, wie mein Programm ausführt: mit dem Rest der Daten alle Nullen als gut. Im zusammenstellen mit: gcc - O2 - c movingaveragevec4p. c gcc movingaveragevec4p. o - o movingaveragevec4p - framework opencl ---- (HOST CODE) movingaveragevec4p. c ---- ---- (OPENCL KERNEL CODE) movingaveragevec4.cl - --- Ich weiß, dies ist erreichbar mit Boost wie pro: Aber ich möchte wirklich vermeiden, mit Boost. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente als addiert ergänzt wird, wobei kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf erforderlich ist. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einem langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Tony D Jun 14 14 am 14: 27 Ich habe ein Programmierproblem und will mit OpenCL lösen. Das Problem besteht darin, den gleitenden Durchschnitt aus Matrizen zu berechnen. Zum Beispiel: Ich habe 1000 Matrizen: A, B, C, D. (zB jede Matrix hat Größe 4x4 oder größer) Ich möchte den gleitenden Durchschnitt aus diesen 1000 Matrix berechnen (z Fenstergröße5) Das Ergebnis, das ich will ist Ist diese Art von Problem gelöst werden kann mit OpenCL Vielen Dank für Hilfe opencl. 1 Ja, es kann mit OpenCL implementiert werden. Obwohl es gibt ein paar Vorschläge, die Ihnen helfen, eine höhere Leistung Code schreiben könnte. Ich werde versuchen, es selbst zu implementieren, wenn ich Zeit hatte. 1. Wenn Sie nicht in der Lage, in den Arrays der Größe gleich Ihrem Fenster in LDS passen würde es nicht eine gute Idee, LDS überhaupt verwendet werden. In diesem Fall werden Sie mit einem Element nur einmal. 2. Lesen Sie Kapitel 4 des openCL-Programmierhandbuchs, um zu sehen, was Ihnen helfen kann, Ihre Leistung zu verbessern. Das Speicherzugriffsmuster ist das wichtigste, wenn der globale Speicher verwendet werden muss.


No comments:

Post a Comment