Beziehung zwischen der Anzahl der Blöcke von Threads und Cuda-Kernen auf der Maschine (in CUDA C)

8

Ich habe CUDA 2.1 auf meinem Rechner installiert und es hat eine Grafikkarte mit 64 Cuda-Kernen. Ich habe ein Programm geschrieben, in dem ich gleichzeitig 30000 Blöcke (und 1 Thread pro Block) initialisiere. Aber bekomme keine befriedigenden Ergebnisse von der GPU (Es führt langsam als die CPU)

Soll die Anzahl der Blöcke für eine gute Leistung kleiner oder gleich der Anzahl der Kerne sein? Oder hat die Performance nichts mit der Anzahl der Blöcke zu tun?

    
Pushpak Dagade 13.06.2011, 11:35
quelle

2 Antworten

15

CUDA-Kerne sind nicht genau das, was Sie auf einer klassischen CPU als Kern bezeichnen könnten. Tatsächlich müssen sie nur als ALUs (Arithmetische und logische Einheiten) betrachtet werden, die nur in der Lage sind, fertige Operationen zu berechnen.

Sie wissen vielleicht, dass Threads pro Warps (Gruppen von 32 Threads) innerhalb der von Ihnen definierten Blöcke behandelt werden. Wenn Ihre Blöcke auf den verschiedenen SMs (Streaming Multiprozessoren, sie sind die eigentlichen Kerne der GPU) verteilt werden, plant jeder SM Warps innerhalb eines Blocks, um die Rechenzeit in Bezug auf die Speicherzugriffszeit zu optimieren um die Eingabedaten der Threads zu erhalten.

Das Problem ist, dass Threads immer über ihren zugehörigen Warp behandelt werden. Wenn Sie also nur einen Thread pro Block haben, ist der SM, auf dem er läuft, nicht in der Lage, durch Warps zu planen und Sie werden das Multiple nicht nutzen CUDA-Cores verfügbar. Ihre CUDA-Cores warten darauf, dass Daten verarbeitet werden, da CUDA-Cores viel schneller berechnen als Daten über den Speicher abgerufen werden.

Viele Blöcke mit wenigen Threads sind nicht das, was die GPU erwartet. In diesem Fall stößt du auf die block pro SM-Beschränkung (diese Zahl hängt von deinem Gerät ab), wodurch deine GPU viel Zeit aufwenden muss, um Blöcke auf SM zu setzen und sie dann zu entfernen Einsen. Sie sollten statt der Anzahl der Blöcke in Ihrer Anwendung lieber die Anzahl der Threads in Ihren Blöcken erhöhen .

    
jopasserat 13.06.2011, 14:45
quelle
5

Die Warp-Größe in der aktuellen CUDA-Hardware ist 32. Wenn Sie weniger als 32 Threads pro Block verwenden (oder kein rundes Vielfaches von 32 Threads pro Block verwenden), verschwenden Sie nur Zyklen. So wie es aussieht, werden bei Verwendung von 1 Thread pro Block etwa 95% der ALU-Zyklen Ihrer GPU inaktiviert. Das ist der Grund für die schlechte Leistung.

    
talonmies 13.06.2011 11:59
quelle

Tags und Links