Kann jemand die Unterschiede zwischen __global__
und beschreiben __device__
?
Wann soll ich verwenden __device__
und wann __global__
?
Globale Funktionen werden auch als "Kernel" bezeichnet. Dies sind die Funktionen, die Sie von der Hostseite aus mithilfe der CUDA-Kernelaufrufsemantik ( <<<...>>>
) aufrufen können .
Gerätefunktionen können nur von anderen Geräte- oder globalen Funktionen aufgerufen werden. __device__
Funktionen können nicht über den Hostcode aufgerufen werden.
__global__
Funktionen auch mithilfe der CUDA-Kernelsemantik (<<< ... >>>) vom Gerät aus aufgerufen werden, wenn Sie dynamische Parallelität verwenden - dies erfordert CUDA 5.0 und Rechenfähigkeit 3.5 oder höher.Unterschiede zwischen
__device__
und__global__
Funktionen sind:__device__
Funktionen können nur vom Gerät aus aufgerufen werden und werden nur im Gerät ausgeführt.__global__
Funktionen können vom Host aus aufgerufen werden und werden im Gerät ausgeführt.Daher rufen Sie
__device__
Funktionen von Kernelfunktionen auf und müssen die Kerneleinstellungen nicht festlegen. Sie können eine Funktion auch "überladen", z. B.: Sie können deklarierenvoid foo(void)
und__device__ foo (void)
dann wird eine auf dem Host ausgeführt und kann nur von einer Host-Funktion aufgerufen werden. Der andere wird auf dem Gerät ausgeführt und kann nur von einem Gerät oder einer Kernelfunktion aufgerufen werden.Sie können auch den folgenden Link besuchen: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , es war nützlich für mich.
quelle
__global__
- Läuft auf der GPU, die von der CPU oder der GPU * aufgerufen wird. Mit<<<dim3>>>
Argumenten ausgeführt.__device__
- Läuft auf der GPU, die von der GPU aufgerufen wird. Kann auch mit Variablen verwendet werden.__host__
- Läuft auf der CPU, die von der CPU aufgerufen wird.*)
__global__
Funktionen können von anderen__global__
Funktionen aus aufgerufen werden, die dieRechenfähigkeit 3.5 starten .
quelle
Ich werde es mit einem Beispiel erklären:
Wenn also eine Hostfunktion (CPU) eine Gerätefunktion (GPU) aufrufen soll, wird ' global ' verwendet. Lesen Sie dies: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "
Und wenn eine Gerätefunktion (GPU) (eher ein Kernel) eine andere Kernelfunktion aufrufen soll, verwenden wir ' Gerät '. Lesen Sie diese " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "
Dies sollte ausreichen, um den Unterschied zu verstehen.
quelle
__global__
ist für Cuda-Kernel Funktionen, die direkt vom Host aufgerufen werden können.__device__
Funktionen können von__global__
und__device__
Funktionen aufgerufen werden, jedoch nicht vom Host.quelle
Ich nehme hier vorerst einige unbegründete Spekulationen auf (ich werde diese später begründen, wenn ich auf eine maßgebliche Quelle stoße) ...
__device__
Funktionen können einen anderen Rückgabetyp als void haben, aber__global__
Funktionen müssen immer void zurückgeben.__global__
Funktionen können aus anderen Kerneln heraus aufgerufen werden, die auf der GPU ausgeführt werden, um zusätzliche GPU-Threads (als Teil des dynamischen Parallelitätsmodells von CUDA (auch bekannt als CNP)) zu starten, während__device__
Funktionen auf demselben Thread wie der aufrufende Kernel ausgeführt werden.quelle
__global__
Funktion ist die Definition des Kernels. Immer wenn es von der CPU aufgerufen wird, wird dieser Kernel auf der GPU gestartet.Jeder Thread, der diesen Kernel ausführt, muss jedoch möglicherweise immer wieder Code ausführen, z. B. zwei Ganzzahlen austauschen. Somit können wir hier eine Hilfsfunktion schreiben, genau wie wir es in einem C-Programm tun. Und für Threads, die auf einer GPU ausgeführt werden, sollte eine Hilfsfunktion als deklariert werden
__device__
.Daher wird eine Gerätefunktion von Threads eines Kernels aufgerufen - eine Instanz für einen Thread. Währenddessen wird eine globale Funktion vom CPU-Thread aufgerufen.
quelle
__global__
ist ein CUDA C-Schlüsselwort (Deklarationsspezifizierer), das besagt, dass die Funktion,globale Funktionen (Kernel), die vom Host-Code mit gestartet werden
<<< no_of_blocks , no_of threads_per_block>>>
. Jeder Thread führt den Kernel anhand seiner eindeutigen Thread-ID aus.Allerdings
__device__
können Funktionen nicht vom Host aufgerufen werden code.if Sie tun müssen , um sie beide verwenden__host__
__device__
.quelle
Die globale Funktion kann nur vom Host aufgerufen werden und hat keinen Rückgabetyp, während die Gerätefunktion nur von der Kernelfunktion einer anderen Gerätefunktion aufgerufen werden kann und daher keine Kerneleinstellung erforderlich ist
quelle