Ich denke, Sie sollten einen tieferen Einblick in die Planung von Kernen in Cuda haben.
Es gibt zwei wichtige Größen: Blöcke und Fäden pro Block
Jeder Block auf einer SM geplant ist und dort dann in Kett- in Scheiben geschnitten. Blöcke haben daher einen gemeinsamen Speicher, der nur innerhalb des Blocks zugänglich ist, , weil er auf dem SM-Speicher liegt. Die Anzahl der Blöcke pro SM hängt von der Gerätelimit- und Belegungsberechnung ab. Maximale Blöcke pro SM sind 8 für CC 1.0-2.x und 16 für CC 3.x.
Jeder Block hat eine bestimmte Anzahl von Threads pro Block. Die Threads werden in Warps unterteilt und die Warps können in einer beliebigen Reihenfolge ausgeführt werden, die nur durch den Warp- und den SM-Verwalter bestimmt wird.
Jetzt hat Ihre Karte eine Gesamtzahl von 384 Kernen auf 2 SMs mit jeweils 192 Kernen. Die CUDA-Kernzählung stellt die Gesamtzahl der Gleitkommaoperationen oder Integer-Threadanweisungen mit einfacher Genauigkeit dar, die pro Zyklus ausgeführt werden können. Betrachten Sie keine CUDA-Kerne in irgendeiner Berechnung.
Die maximale Anzahl der Threads variiert je Rechenleistung. CC2.0-3.x unterstützt maximal 1024 Threads pro Block bei ausreichenden Registern und Warp-Slots. Warps werden Warp-Schedulern statisch zugewiesen. Die Anzahl der Warp-Scheduler pro SM beträgt 1 für CC 1.x, 2 für CC 2.x und 4 für CC 3.x.
Wenn Ihre Anwendung keine gleichzeitigen Kernels ausführt, dann muss zur Verwendung jedes SM die GridDim> = Anzahl der SM-Blöcke haben.
Damit die GTX650m Ihre Rechenleistung voll ausnutzt, sollten Sie mindestens zwei Blöcke haben (sonst könnte man mit einem Block nur einen SM verwenden). Auf der anderen Seite, wenn Sie 10240 Threads planen möchten, können Sie einfach 10 Blöcke von jeweils 1024 Threads planen.
Danke. Die Warp-Planung war, was ich vermisste, denke ich. –