CUDA: Gekachelte Matrix-Matrix-Multiplikation mit gemeinsamem Speicher und Matrixgröße, die kein Vielfaches der Blockgröße ist

7

Ich versuche, mich mit der CUDA-Programmierung vertraut zu machen, und habe eine ziemlich lustige Zeit davon. Im Moment schaue ich mir dieses PDF an, das sich mit Matrixmultiplikation beschäftigt , mit und ohne gemeinsamen Speicher gemacht. Der vollständige Code für beide Versionen finden Sie hier . Dieser Code ist fast genau derselbe wie in den CUDA-Matrix-Multiplikations-Samples. Obwohl die Nicht-Shared-Memory-Version unabhängig von der Blockgröße mit jeder Matrixgröße ausgeführt werden kann, muss die Shared Memory-Version mit Matrizen arbeiten, die ein Vielfaches der Blockgröße sind (die ich auf 4 festlegte, Standard war ursprünglich 16). .

Eines der am Ende der PDF vorgeschlagenen Probleme besteht darin, es so zu ändern, dass die Shared-Memory-Version auch mit Nicht-Vielfachen der Blockgröße arbeiten kann. Ich dachte, dies wäre eine einfache Indexüberprüfung, wie in der nicht geteilten Version:

%Vor%

Aber das funktioniert nicht. Hier ist der vollständige Code, abzüglich der Hauptmethode (ein bisschen Chaos, Entschuldigung), die von mir etwas modifiziert wurde:

%Vor%

Bemerkenswerte Dinge, die ich geändert habe: Ich habe einen Check in MatMulKernel hinzugefügt, der überprüft, ob unser aktueller Thread versucht, an einer Stelle in C zu arbeiten, die nicht existiert. Das scheint nicht zu funktionieren. Obwohl es das Ergebnis ändert, scheinen die Änderungen kein anderes Muster zu haben als später (höhere x- oder y-Werte) scheinen stärker betroffen zu sein (und ich bekomme viel mehr nicht-ganzzahlige Ergebnisse). Ich änderte auch die angegebene dimGrid-Berechnungsmethode und die Schleifenbedingung für m in MatMulKernel (vorher war es nur Breite oder Höhe geteilt durch Blockgröße, was falsch schien).

Selbst der Lösungsleitfaden, den ich für diesen Leitfaden gefunden habe, scheint darauf hinzudeuten, dass es sich nur um einen einfachen Index-Check handeln sollte, daher glaube ich, dass mir etwas wirklich Grundlegendes fehlt.

    
Mike 15.09.2013, 17:45
quelle

1 Antwort

20

Wenn die Matrixdimensionen kein Vielfaches der Kacheldimensionen sind, kann es vorkommen, dass einige Kacheln die Matrizen nur teilweise bedecken. Die Kachelelemente, die außerhalb der nicht vollständig überlappenden Kacheln liegen, sollten ordnungsgemäß null sein. Daher ist es einfach, Ihren Code auf beliebig große Matrizen zu erweitern, aber das ist kein einfacher Index-Check. Im Folgenden kopiere und füge ich meine Version des gekachelten Matrix-Matrix-Multiplikationskerns mit beliebig großen Matrizen ein

%Vor%     
JackOLantern 17.09.2013, 17:21
quelle

Tags und Links