In CUDA, you can determine which GPU a thread is running on by using the cudaGetDevice() function, which retrieves the current device in use. Here’s a quick example in CUDA C++:
2
3
cpp
4
5
#include <cuda_runtime.h>
6
#include <iostream>
7
8
__global__ void checkDevice() {
9
int device;
10
cudaGetDevice(&device);
11
printf("This code is running on GPU device: %d\n", device);
12
}
13
14
int main() {
15
// Set a specific device (optional)
16
int device = 0;
17
cudaSetDevice(device);
18
19
// Launch a kernel to check which device it’s running on
20
checkDevice<<<1, 1>>>();
21
cudaDeviceSynchronize(); // Wait for the kernel to complete
22
23
return 0;
24
}
25
26
Explanation
27
28
cudaGetDevice(): Returns the current GPU device on which the code is running.
29
cudaSetDevice(int device): Sets a specific GPU device before launching the kernel, if needed.
30
cudaDeviceSynchronize(): Ensures that the kernel finishes execution before continuing (useful for seeing printed output).
31
32
This code launches a kernel checkDevice that runs on the currently selected GPU, printing the device ID.
Nicht ausprobiert, aber vielleicht hilft die Info...
Such Mal nach einem Tool/Code das die verfügbaren devices auflistet.
Wenn da nur deine Hardware gelistet wird kann es nur auf der GPU laufen.
Meinst Du den Befehl "nvidia-smi"?
Das Ergebnis im angehängten Bild würde ich so interpretieren, dass die CUDA -Installation irgendwie korrekt ist. Das Hello-World im Eingangspost kann ich kompilieren und es erscheint der Output in der Konsole.
Ich wollte die NVIDIA-Samples aus diesem Repository ausprobieren:
Mit CUDA direkt arbeiten ist aber auch grausam. Da würde ich mir einen Layer of Abstraktion gönnen. tinygrad oder so. Der 470 Treiber ist halt ein Indiz auf deine alte Hardware. Eventuell gibt das Probleme, wobei die Kombi 11.4 + 470 die stabilste / kompatibelste ist.
Eventuell gibt das Probleme, wobei
die Kombi 11.4 + 470 die stabilste / kompatibelste ist.
Tja, irgendwie scheint meine Installation da ein wenig durcheinander.
Aus dem ScreenShot ist ja die Cuda-Version 11.4 und der Treiber 470 ersichtlich.
Zum kompilieren des Hello-World nutze ich das Kommando
1
nvcc hello.cu
Das scheint ja zu kompilieren und die Ausgabe erscheint.
Die NVIDA-Samples compilieren auch, werfen aber den oben besagten Fehler 35 (Versionskonflikt)
Wenn ich mit synaptic auf die installierte Cuda-Version schaue, steht da 12.6
Das make-File der NVIDIA samples scheint also die neuere CUDA-Version nutzen zu wollen, während das Kommando "nvcc" vermutlich mit der passenden, alten kompiliert.
aber die Frage ist: Wie kann man feststellen, dass
es auf der GPU und nicht auf dem Prozessor läuft?
Tja, wirklich gute Frage! Ich hab zwar jetzt von CUDA echt NullPlan, trotzdem würde ich in erster Näherung vermuten, daß folgende Zeile
global
dem nvcc sagt, daß die darauffolgende Funktion auf der GK laufen soll. Wenn das Manual meine Vermutung bestätigen sollte und Du Deinem nvcc vertraust, bist Du fertig.
Falls Du aber Deinem Compiler misstraust, dann - ja dann - isses echt blöd, denn dann solltest Du auch keinem anderen Tool trauen. Damit bleibt Dir als letzter Ausweg nur, die Binary in mühevoller Handarbeit in Assembler rückzuwandeln und dann zu kontrollieren, ob sie das gewünschte macht und wo gerechnet wird. --- Viel Spaß! ;)
Gibt da ein nettes Essay über das grundlegende Problem einen ersten Compiler auf einer Maschine vertrauenswürdig bootzustrappen, entweder vom K. oder R. aus K&R, wenn ich mich recht erinnere.
Normalerweise sieht man im Taskmanager und Co die Last der GPU.
So Kleinkram mit wenigen hundert Elementen sieht man allerdings erst gar nicht. Die Grafikkarte ist ja schließlich dafür gemacht, 4096x2048x3*120 Byte pro Sekunde allein "nebenbei" zu erzeugen.
Soweit ich weiß, werden Cuda-Kernels immer auf der Grafikkarte ausgeführt. Man kann aber das zu verwendende Gerät auch mit cudaSetDevice explizit auswählen.
Wenn du ganz genau wissen willst, was passiert, kannst du NVIDIA Nsight Verwenden. Das zeigt dir genau, was wann wo ausgeführt wurde, wann Daten über den Bus gelaufen sind und wie lange das alles gebraucht hat.