Ich experimentiere seit Tagen mit CUDA Kernel um eine schnelle 2D Faltung zwischen einem 500x500 Bild (aber ich könnte auch die Abmessungen variieren) und einem sehr kleinen 2D Kernel (a Laplace-2d-Kernel, so ist es ein 3x3-Kernel .. zu klein, um einen großen Vorteil mit all den Cuda-Threads zu nehmen).CUDA kleiner Kernel 2d Faltung - wie geht das?
Ich habe eine CPU-Classic-Implementierung (zwei For-Schleifen, so einfach wie Sie denken) erstellt und dann begann ich CUDA-Kernel zu erstellen.
Nach einigen enttäuschenden Versuchen, eine schnellere Faltung auszuführen ich mit diesem Code endete: http://www.evl.uic.edu/sjames/cs525/final.html (den Shared-Memory-Abschnitt), läßt es im Grunde ein 16x16 Fäden Lesen alle Faltungsdatenblock er in dem gemeinsamen genutzten Speicher benötigt und führt dann die Faltung durch.
Nichts, die CPU ist immer noch viel schneller. Ich habe den FFT-Ansatz nicht versucht, weil das CUDA-SDK angibt, dass es mit großen Kernel-Größen effizient ist.
Unabhängig davon, ob Sie alles habe ich gelesen, geschrieben, meine Frage ist:
wie kann ich eine schnelle 2D Faltung zwischen einem relativ großen Bild und einem sehr kleinen Kern (3x3) mit CUDA durchführen?
Was meinen Sie mit "die CPU ist immer noch viel schneller"? Zählen Sie das vollständige Programm, einschließlich des Kopierens von Arbeitsspeicher auf und von der GPU oder nur die Zeit, die der Kernel zum Starten und Beenden benötigt? –
Ich brauche kein Timing für jetzt, ich kann sehen, dass das Programm mit der CPU viel schneller beendet :( – paulAl