GPU-Programmierung
Wie erhält bei CUDA das CPU-seitige Programm die Ergebnisse, die ein GPU-Kernel (eine mit __global__ gekennzeichnete Funktion) berechnet hat?
- AÜber den Rückgabewert (return) des Kernels, der die Ergebnisse aller Threads gesammelt an die CPU zurückgibt
- BDer Kernel schreibt seine Ergebnisse in ein Array im GPU-Speicher, und die CPU-Seite kopiert dieses Array nach Ende des Kernels in den CPU-Speicher (oder liest Unified Memory)
- CDas CPU-seitige Programm liest die Werte, die jeder Thread mit printf ausgegeben hat, als Variablen ein
Antwort und Erläuterung anzeigen
Antwort: B. Der Kernel schreibt seine Ergebnisse in ein Array im GPU-Speicher, und die CPU-Seite kopiert dieses Array nach Ende des Kernels in den CPU-Speicher (oder liest Unified Memory)
Ein GPU-Kernel wird von vielen Threads gleichzeitig ausgeführt und kann seine Ergebnisse daher nicht als einzelnen Rückgabewert liefern; bei CUDA muss eine __global__-Funktion den Rückgabetyp void haben. Die CPU-Seite reserviert ein Array im GPU-Speicher und übergibt dessen Zeiger als Argument, und jeder Thread schreibt sein Ergebnis in das Element, für das er zuständig ist. Da Kernel-Starts asynchron sind, kopiert die CPU-Seite das Array nach Ende des Kernels mit cudaMemcpy o. Ä. zurück (im selben Stream wartet die Kopie auf das Ende des vorherigen Kernels). printf im Kernel ist ein Debugging-Hilfsmittel zur Anzeige; das Programm kann diese Werte nicht einlesen.