Gleitender Durchschnitt In Cuda


Im nicht ein Programmierer mit irgendwelchen Fähigkeiten. Nur jemand neugierig CUDA und so Im tut ein wenig lesen. Ich lief über ein Beispiel der Verwendung von Thrust, um einen gleitenden Durchschnitt zu tun: Das Beispiel, wie es ist, läuft und funktioniert meistens richtig. Allerdings trivial in dem Sinne, dass es nur eine gleitende durchschnittliche Operation. Wie würde ich sagen, 352 dieser gleitenden durchschnittlichen Operationen parallel, die alle auf dem gleichen Datenstrom In meinem Kopf könnte der Programmablauf sein: Generieren Sie die Daten amp senden Sie es an einen CUDA-Kern. Kopieren Sie es aus dem CUDA-Kern in alle anderen 351 CUDA-Kerne in meinem GTX 465 Sagen Sie jedem CUDA-Kern, welche Anzahl der Datenelemente durchschnittlich über. (4. 5. 6. 352. 353. 354) Sagen Sie dem Gerät, den Durchschnitt in jedem Kern parallel ausführen Lesen Sie die Ergebnisse von jedem Kern Ich erhalte, dass dieser Code macht es alle passieren, aber wie bekomme ich Thrust zu tun Viele von ihnen parallel Mein Interesse hier ist über etwas wie Bestandsdaten. Wenn Im Blick auf GOOG Preise Id gesetzt, dass in der GPU mit allen Kernen und lassen Sie es dort. Id dann frei sein, um viel Verarbeitung zu tun, ohne das Laden der Daten mehr und nur das Lesen zurück Ergebnisse aus jedem Kern. HINWEIS: Ich möchte nicht GOOG in allen Kernen verwenden. Einige Kerne konnten GOOG sein, andere mit irgendein anderem Symbol, aber Kranke erhalten dort später. Ich denke gerade, dass ich nicht die auf lagerdaten im globalen Gedächtnis wünsche, wenn theres genügend Raum in jedem Kern. Ich nehme an, dies ist ziemlich einfach für CUDA amp Thrust Sep 12 12 at 19:39 Mein Verständnis ist, dass Sie sich für die folgenden zwei Situationen interessieren: Sie haben eine lange Abfolge von Elementen, und Sie wollen eine bestimmte Anzahl von Durchschn Mittelwertbildung auf unterschiedliche Stückzahlen, dh unterschiedliche Längen für das gleitende Mittelfenster. Dies ist, was ich aus Ihrer ursprünglichen Frage zu verstehen. Sie haben eine Folge von Sequenzen, die nacheinander im Speicher abgelegt werden, und Sie möchten sie parallel zu einem festen Mittelungsfenster der Größe 2 RADIUS 1 zu klassifizieren. Dies ist, was der ArrayFire-Code von asm vorgeschlagen hat - Sie haben ihn akzeptiert. Statt mit CUDA Thrust, ich denke, es wäre einfacher, Ihre eigenen CUDA Kernel schreiben, um die oben genannten Operationen zu tun. Unten, ein voll gearbeitetes Beispiel, das in der gleichen Weise arbeitet wie der von asm vorgeschlagene ArrayFire-Code, also für Fall 2. Die Änderung an Fall 1 wäre einfach. Sie können das exponentielle gleitende durchschnittliche Fenster abschneiden und dann Ihr gefiltertes Signal berechnen, indem Sie eine Faltung zwischen Ihrem Signal und dem fensterartigen Exponential durchführen. Die Faltung kann mit Hilfe der freien CUDA-FFT-Bibliothek (cuFFT) berechnet werden, da, wie Sie vielleicht wissen, die Faltung als punktweise Multiplikation der beiden Signale in der Fourier-Domäne ausgedrückt werden kann (Dies ist der treffende Name Faltungstheorem, Die mit einer Komplexität von O (n log (n)) verläuft). Diese Art von Ansatz wird Ihre CUDA-Kernel-Code zu minimieren und laufen sehr sehr schnell, auch auf einer GeForce 570 Besonders, wenn Sie alle Ihre Berechnungen in Single (Float) Präzision zu tun. Ich würde vorschlagen, die oben genannten Differenz-Gleichung zu manipulieren, wie unten angegeben und dann mit CUDA Thrust primitives. DIFFERENCE GLEICHSTELLUNG MANIPULATION - EXPLIZIT FORM DER DIFFERENZGLEICHUNG Durch einfache Algebra können Sie folgendes finden: Dementsprechend ist die explizite Form die folgende: CUDA THRUST IMPLEMENTATION Sie können das obige explizite Formular durch die folgenden Schritte implementieren: Initialisieren einer Eingabesequenz dinput to Alpha mit Ausnahme von dinput0 1. Definiere einen Vektor d1overbetatothen gleich 1, 1beta, 1beta2, 1beta3. Multiplizieren Sie elementweise dinput durch d1overbetatothen Führen Sie eine inclusivescan, um die Sequenz der yn betan zu erhalten Teilen Sie die obige Sequenz durch 1, 1beta, 1beta2, 1beta3. Der obige Ansatz kann für Linear Time-Varying (LTV) - Systeme empfohlen werden. Für lineare zeitinvariante (LTI) Systeme kann der von Paul erwähnte FFT-Ansatz empfohlen werden. Ich bin ein Beispiel für diese Ansatz, indem Sie CUDA Thrust und cuFFT in meiner Antwort auf FIR-Filter in CUDA. Bei der Berechnung eines gleitenden Durchschnitt, die Platzierung der Durchschnitt in der mittleren Zeitspanne macht Sinn Im vorherigen Beispiel haben wir den Durchschnitt der ersten berechnet 3-Zeitperioden und platzierte es neben Periode 3. Wir konnten den Durchschnitt in der Mitte des Zeitintervalls von drei Perioden platziert haben, das heißt, neben Periode 2. Dies funktioniert gut mit ungeraden Zeitperioden, aber nicht so gut für sogar Zeit Abschnitte. Also wo würden wir den ersten gleitenden Durchschnitt platzieren, wenn M 4 Technisch, würde der Moving Average bei t 2,5, 3,5 fallen. Um dieses Problem zu vermeiden, glätten wir die MAs mit M 2. So glätten wir die geglätteten Werte Wenn wir eine geradzahlige Anzahl von Termen mitteln, müssen wir die geglätteten Werte glätten Die folgende Tabelle zeigt die Ergebnisse mit M 4.

Comments

Popular posts from this blog

Forex Rhb

14 Tage Exponentieller Gleitender Durchschnitt

Binäre Optionen Wordpress Thema