Friday 9 June 2017

Cuda Moving Average Filter


Was ist CUDA Einschreiben heute Intro zur Parallelprogrammierung Ein offener Onlinekurs von Udacity Instruktoren: Dr. John Owens, UC Davis und Dr. David Luebke, NVIDIA CUDA reg ist eine parallele Rechenplattform und Programmiermodell, das von NVIDIA erfunden wurde. Es ermöglicht eine drastische Steigerung der Rechenleistung durch die Nutzung der Leistung der Grafikverarbeitungseinheit (GPU). Mit Millionen von CUDA-fähigen GPUs, die bisher verkauft wurden, finden Softwareentwickler, Wissenschaftler und Forscher breite Einsatzmöglichkeiten für das GPU-Computing mit CUDA. Hier sind ein paar Beispiele: Identifizieren Sie versteckte Plaque in Arterien. Herzinfarkt ist weltweit die führende Todesursache. Harvard Engineering, Harvard Medical School und Brigham Womens Hospital haben sich zusammengetan, um GPUs zu verwenden, um den Blutfluss zu simulieren und versteckte arterielle Plaque ohne invasive Imaging-Techniken oder explorative Chirurgie zu identifizieren. Analysieren Sie den Flugverkehr. Das Nationale Luftraumsystem verwaltet die landesweite Koordination des Flugverkehrs. Computermodelle helfen, neue Wege zu finden, um Staus zu lindern und den Flugzeugverkehr effizient zu bewegen. Mit der Rechenleistung von GPUs erhielt ein Team der NASA einen großen Leistungsgewinn und reduzierte die Analysezeit von zehn Minuten auf drei Sekunden. Visualisierung von Molekülen. Eine molekulare Simulation namens NAMD (nanoskalige Molekulardynamik) bekommt eine große Leistungssteigerung bei GPUs. Die Beschleunigung ist ein Ergebnis der parallelen Architektur von GPUs, die es NAMD-Entwicklern ermöglicht, mit dem CUDA Toolkit rechenintensive Teile der Applikation an die GPU anzuschließen. Hintergrund GPU Computing: Die Revolution Youre konfrontiert mit Imperativen: Verbesserung der Leistung. Löse schnell ein Problem. Parallelverarbeitung wäre schneller, aber die Lernkurve ist steil ist es nicht mehr. Mit CUDA können Sie C-, C - und Fortran-Code direkt an GPU senden, keine Montagesprache erforderlich. Entwickler von Unternehmen wie Adobe, ANSYS, Autodesk, MathWorks und Wolfram Research wachen, dass die GPU schlafen, um die universelle wissenschaftliche und technische Informatik über eine Reihe von Plattformen zu machen. Bei der Verwendung von hochrangigen Sprachen führen GPU-beschleunigte Anwendungen den sequentiellen Teil ihrer Arbeitsbelastung auf die CPU aus, die für die Single-Thread-Performance optimiert ist, während die Parallelverarbeitung auf der GPU beschleunigt wird. Dies wird GPU-Computing genannt. GPU-Computing ist möglich, weil die heutige GPU viel mehr macht als Grafik zu machen: Es sizzelt mit einem Teraflop von Gleitkomma-Performance und knirscht Applikationsaufgaben für alles von Finanzen bis Medizin. CUDA ist weit verbreitet durch Tausende von Anwendungen und veröffentlichten Forschungsarbeiten und unterstützt von einer installierten Basis von über 375 Millionen CUDA-fähigen GPUs in Notebooks, Workstations, Compute-Cluster und Supercomputer. Besuchen Sie die CUDA Zone für Anwendungsbeispiele in verschiedenen vertikalen Märkten und wecken Sie Ihren GPU-Riesen. Geschichte der GPU-Computing Die ersten GPUs wurden als Grafikbeschleuniger konzipiert und unterstützen nur spezifische Fixed-Function-Pipelines. Beginnend in den späten 1990er Jahren wurde die Hardware zunehmend programmierbar und gipfelte in NVIDIAs erste GPU im Jahr 1999. Weniger als ein Jahr nach NVIDIA prägte der Begriff GPU, Künstler und Spieleentwickler werent die einzigen, die bahnbrechende Arbeit mit der Technologie machen: Forscher waren Die hervorragende Gleitkomma-Leistung zu erschließen. Die Bewegung der Allzweck-GPU (GPGPU) war dämmern. Aber GPGPU war bei weitem nicht leicht, auch für diejenigen, die Grafikprogrammiersprachen wie OpenGL kennen. Entwickler mussten wissenschaftliche Berechnungen auf Probleme abbilden, die durch Dreiecke und Polygone dargestellt werden könnten. GPGPU war praktisch off-Limits für diejenigen, die nicht die neuesten Grafik-APIs gespeichert hatte, bis eine Gruppe von Stanford University Forscher, um die GPU als Streaming-Prozessor zu reimagieren. Im Jahr 2003 enthüllte ein Team von Forschern unter der Leitung von Ian Buck Brook, das erste weit verbreitete Programmiermodell, um C mit Datenparallel-Konstrukten zu erweitern. Mit Hilfe von Konzepten wie Streams, Kernel und Reduktionsoperatoren stellte das Brook-Compiler - und Runtime-System die GPU als Allzweckprozessor in einer hochrangigen Sprache dar. Am wichtigsten war, dass Brook-Programme nicht nur einfacher zu schreiben waren als handgestimmte GPU-Code, sie waren siebenmal schneller als ein ähnlicher Code. NVIDIA wusste, dass glänzend schnelle Hardware mit intuitiven Software - und Hardware-Tools gekoppelt werden musste und Ian Buck dazu einlud, sich dem Unternehmen anzuschließen und eine Lösung für die nahtlose Ausführung von C auf der GPU zu entwickeln. SVIDIA stellte die Software und Hardware zusammen, NVIDIA enthüllte CUDA im Jahr 2006 die weltweit erste Lösung für das General Computing auf GPUs. Werkzeuge und Training Heute wächst das CUDA-Ökosystem rasch, da immer mehr Unternehmen erstklassige Werkzeuge, Dienstleistungen und Lösungen anbieten. Wenn du deinen eigenen Code schreiben möchtest, ist der einfachste Weg, um die Leistung von GPUs zu nutzen, mit dem CUDA Toolkit. Die eine umfassende Entwicklungsumgebung für C - und C-Entwickler bietet. Das CUDA Toolkit umfasst einen Compiler, Mathematik-Bibliotheken und Tools zum Debuggen und Optimieren der Performance Ihrer Anwendungen. Youll finden auch Code-Beispiele, Programmier-Guides, Benutzerhandbücher, API-Referenzen und andere Dokumentation, um Ihnen den Einstieg zu erleichtern. NVIDIA bietet das alles kostenlos, darunter NVIDIA Parallel Nsight für Visual Studio, die branchenweit erste Entwicklungsumgebung für massiv parallele Anwendungen, die sowohl GPUs als auch CPUs nutzen. Das Lernen, CUDA zu benutzen, ist bequem, mit umfangreichem Online-Training sowie anderen Ressourcen wie Webinaren und Büchern. Über 400 Universitäten und Hochschulen lehren CUDA-Programmierung, darunter Dutzende von CUDA Centers of Excellence und CUDA Research und Training Centers. Für Entwickler Für einen anderen Ansatz können Sie das exponentielle gleitende Durchschnittsfenster abschneiden und dann Ihr gefiltertes Signal berechnen, indem Sie eine Faltung zwischen Ihrem Signal und dem fensterförmigen Exponential machen. Die Faltung kann unter Verwendung der freien CUDA-FFT-Bibliothek (cuFFT) berechnet werden, da, wie Sie vielleicht wissen, die Faltung als die punktuelle Multiplikation der beiden Signale in der Fourier-Domäne ausgedrückt werden kann (Dies ist der treffende Name Faltungs-Theorem, Die mit einer Komplexität von O (n log (n)) läuft). Diese Art von Ansatz minimiert Ihren CUDA-Kernel-Code und läuft sehr sehr schnell, auch auf einer GeForce 570 Besonders wenn Sie alle Ihre Berechnungen in Single (Float) Präzision machen können. Ich würde vorschlagen, die oben genannte Differenzen Gleichung wie unten angegeben zu manipulieren und dann mit CUDA Thrust Primitiven. DIFFERENCE EQUATION MANIPULATION - EXPLICIT FORM DER UNTERSCHIEDLICHEN GLEICHUNG Durch einfache Algebra finden Sie folgendes: Dementsprechend ist die explizite Form folgendermaßen: CUDA THRUST IMPLEMENTATION Sie können das oben genannte Formular durch die folgenden Schritte implementieren: Initialisieren Sie eine Eingabefolge dinput to Alpha mit Ausnahme von dinput0 1. Definieren Sie einen Vektor d1overbetatothen gleich 1, 1beta, 1beta2, 1beta3. Multiplizieren Sie elementares Dinput durch d1overbetatothen Führen Sie einen Inklusivkanal aus, um die Sequenz des yn betan zu erhalten. Teilen Sie die obige Sequenz mit 1, 1beta, 1beta2, 1beta3 auf. Der oben genannte Ansatz kann für Linear Time-Varying (LTV) - Systeme empfohlen werden. Für Linear Time-Invariante (LTI) - Systeme kann der von Paul erwähnte FFT-Ansatz empfohlen werden. Im, die ein Beispiel für diesen Ansatz unter Verwendung von CUDA Thrust und cuFFT in meiner Antwort auf FIR-Filter in CUDA. Average Filter ist Fenster-Filter der linearen Klasse, die glättet Signal (Bild). Der Filter arbeitet als Tiefpass. Die Grundidee hinter dem Filter ist für jedes Element des Signals (Bild) einen Durchschnitt über seine Nachbarschaft. Wenn wir eine mxn-Matrix wünschen und wir den mittleren Filter mit der Größe k darauf anwenden wollen, dann ist für jeden Punkt in der Matrix p: (i, j) der Wert des Punktes der Durchschnitt aller Punkte im Quadrat. Diese Figur ist Für quadratischen Kern der Filterung mit Größe 2. dass die gelbe Box ist das Pixel gemittelt werden, und das ganze Gitter ist das Quadrat der Nachbar-Pixel, dass die Pixel neuen Wert wird der Durchschnitt von ihnen. Das Problem ist, dass dieser Algorithmus sehr langsam ist, besonders auf großen Bildern, also habe ich über die Verwendung von GPGPU nachgedacht. Die Frage ist jetzt. Wie kann dies in cuda umgesetzt werden, wenn es möglich ist Dies ist ein klassischer Fall von peinlich parallelen Bildverarbeitungsproblemen, die sehr leicht auf CUDA Framework abgebildet werden können. Der Mittelwertfilter ist als Box Filter in Bildverarbeitungsbereichen bekannt. Der einfachste Ansatz wäre, CUDA-Texturen für den Filterprozess zu verwenden, da die Randbedingungen sehr leicht durch Texturen gehandhabt werden können. Angenommen, Sie haben Quell - und Zielzeiger auf dem Host zugewiesen. Das Verfahren wäre so etwas. Verteilen Sie ausreichend Speicher, um die Quell - und Zielbilder auf dem Gerät zu halten. Kopiere das Quellbild vom Host zum Gerät. Binden Sie die Quelle Bild Gerät Zeiger auf Textur. Geben Sie eine entsprechende Blockgröße und ein Raster an, das groß genug ist, um jedes Pixel des Bildes zu decken. Starten Sie den Filterkern mit dem angegebenen Raster und der Blockgröße. Kopiere die Ergebnisse zurück zum Host. Unbind die Textur Freie Gerätezeiger. Beispiel-Implementierung von Box-Filter Die gute Nachricht ist, dass Sie nicht haben, um den Filter selbst zu implementieren. Das CUDA Toolkit kommt mit kostenloser Signal - und Bildverarbeitungsbibliothek namens NVIDIA Performance Primitives aka NPP, hergestellt von NVIDIA. NPP nutzt CUDA-fähige GPUs, um die Verarbeitung zu beschleunigen. Der Mittelungsfilter ist bereits in NPP implementiert. Die aktuelle Version von NPP (5.0) hat Unterstützung für 8-Bit-, 1-Kanal - und 4-Kanal-Bilder. Die Funktionen sind: nppiFilterBox8uC1R für 1 Kanalbild. NppiFilterBox8uC4R für 4-Kanal-Bild. Antwortete am 15. Januar um 10:50 Deine Antwort scheint sehr gut zu sein, aber ich weiß nicht genau, was du dort oben beschreibst, da ich hauptsächlich auf Matlab programmiere und gute Kenntnisse über C-Programmierung, was ich brauche, ist ein Code-Hilfe, ich denke, der Kernel-Funktion Prototyp wäre: global void ApplyAverageFilter (int Image, int Ergebnis, int filterSize). Ich brauche Hilfe mit dem Code. Ndash Sameh Kamal Jan 15 13 um 10:56 Oh. Ich habe meine Antwort aktualisiert und einen Link für den CUDA-Kernel für die Boxfilterung hinzugefügt. Aber du musst zuerst CUDA lernen, um es zu benutzen. Ansonsten NPP ist eine bessere Option, wenn Sie don39t haben viel CUDA Hintergrund. Ndash sgarizvi Wenn die Filtergröße normal und nicht humongous ist, ist der durchschnittliche Filter ein sehr guter Fall für die Implementierung mit CUDA. Sie können dies mit quadratischen Blöcken und jeder Thread des Blocks ist verantwortlich für die Berechnung des Wertes von einem Pixel, durch Summierung und Mittelung seiner Nachbarn. Wenn du das Bild im Global Memory speicherst, dann kann es einfach programmiert werden, aber du wirst viele Bankkonflikte haben. Eine mögliche Optimierung ist, dass Sie Blöcke des Bildes in die Blöcke Shared Memory laden. Mit Phantom-Elementen (so dass man die geteilten Blöcke nicht übersteigt, wenn man nach benachbarten Pixeln sucht) kannst man den Durchschnitt der Pixel innerhalb eines Blocks berechnen. Der einzige denke, dass du vorsichtig sein musst, ist, wie die Nähte am Ende gemacht werden, weil die geteilten Speicherblöcke sich überlappen (wegen der zusätzlichen Polsterungspixel) und du willst ihre Werte nicht zweimal berechnen. Antwortete Jan 15 13 um 9:27 Deine Antwort 2017 Stack Exchange, Inc

No comments:

Post a Comment