2017-11-20 5 views
-1

Ich bin total neu in Cuda und ich würde gerne einen Cuda Kernel schreiben, der eine Faltung berechnet, die eine Eingabematrix, Faltung (oder Filter) und eine Ausgabematrix hat.Wie schreibe ich den Cuda Kernel für Faltungen?

Hinweis: Ich möchte, dass jeder Thread des Cuda-Kernels einen Wert in der Ausgabematrix berechnet.

Wie kann ich das tun?

+0

Soweit ich mich erinnere, gab es Dutzende von Beispielen auf der CUDA-Website. Vor allem angesichts der Tatsache, dass Faltung eine sehr häufige Aufgabe ist. Hat sich das geändert oder hast du dort nichts gefunden? – CWBudde

+0

@CWBudde danke für Ihren Kommentar. Ja, ich habe ein paar lange Beispiele mit vielen harten Fällen auf den ganzen Webseiten gefunden, aber leider habe ich noch keinen direkten gefunden. Ich werde mehr als glücklich sein, wenn Sie welche haben. – Bilgin

Antwort

0

Wenn die Filter den Füllbereich der Matrix abdecken, kann sie direkt in cublasSgemm konvertiert werden. Angenommen, die Dimensionen der Matrix sind 5 * 4, und Sie benötigen 130 Filter, dann ist die zu trainierende Filtermatrix 130 * 20 und die 5 * 4-Matrix kann als 20 * verwendet werden. *.

Auf diese Weise ist die Berechnungsgeschwindigkeit optimal; Es wird in Matrixmultiplikation zwischen m1 (130, 20) und m2 (20, 1) konvertiert.

+0

danke für deinen Kommentar und Beispiel. es gab mir ein Verständnis für das Problem. Haben Sie auch ein cuda code Beispiel um dies zu tun. Ich würde gerne wissen, wie es funktioniert, wenn es möglich ist. Danke – Bilgin

+0

Ich rufe Cuda Bibliothek immer mit "JCuda" an, also sind die Codes nicht in C. Sie können cublasSgemm Beispiele im Web sowie die Beispiele auf Cuda Handbuch überprüfen. Setzen Sie sgemm mit den Operationen 'N' und 'N' und setzen Sie lda und ldb und ldc auf 130, 20 und 130. Es dauert ein wenig, bis Sie sich mit der cublasSgem-Methode vertraut gemacht haben. – Tom

+0

danke. sicher werde ich überprüfen und code und ich werde sie aktualisieren. – Bilgin

0

Wenn Sie nach einem Bildkonvolutions-Kernel suchen, kann dieser Link hilfreich sein (Two Dimensional (2D) Image Convolution in CUDA by Shared & Constant Memory: An Optimized way).

Soweit ich betroffen ist, kann die Verwendung jedes Threads, um ein Pixel oder eine Position in der Ausgabe zu berechnen, nicht eine sehr gute Idee sein. Bitte beachten Sie, wie der Unterbereich für diese Faltung geladen wird oder ob die Threads in demselben Warp bei jedem Lesevorgang fortlaufenden Speicher lesen. Andernfalls kann der Kernel unter dem Laden von Daten leiden, obwohl über Hunderte von Threads verfügbar sind.

Daher können Sie im Grunde nur den beschriebenen Code schreiben und den Profiler (nvvp) für weitere Optimierungsvorschläge verwenden.

+0

Danke für den Kommentar und die referenzierte Website. Ich bin nur auf der Suche nach einem 2-dimensionalen Convolution-Kernel zur Verwendung auf Grafikprozessoren mit CUDA. Am Ende möchte ich, dass mein Code die Eingabe-, Filter- und Ausgabe-Matrizen druckt. – Bilgin

Verwandte Themen