Unterschied zwischen globalen und Gerätefunktionen


65

Kann jemand die Unterschiede zwischen __global__ und __device__ beschreiben?

Wann sollte ich __device__ verwenden und wann __global__?.

93

Globale Funktionen werden auch "Kernel" genannt. Es sind die Funktionen, die Sie von der Host-Seite aus aufrufen können, indem Sie die CUDA-Kernel-Aufruf-Semantik verwenden (<<<...>>>).

Gerätefunktionen können nur von anderen Geräten oder globalen Funktionen aus aufgerufen werden. __device__ Funktionen können nicht vom Host-Code aus aufgerufen werden.

+7

nur als Zusatz, '__global__' Funktionen können auch von dem Gerät mit CUDA Kernel Semantik (<<<...> >>) aufgerufen werden, wenn Sie dynamische Parallelität verwenden - die CUDA 5.0 und Rechenkapazität 3.5 oder höher benötigt. 11 sep. 122012-09-11 17:44:18


10

__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, aber nicht vom Host.


28

Unterschiede zwischen __device__ und __global__ Funktionen sind:

__device__ funktioniert nur aus dem Gerät aufgerufen werden kann, und es wird nur in dem 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 Kernel-Funktionen, und Sie müssen nicht die Kernel-Einstellungen festlegen. Sie können eine Funktion auch "überladen", z. B .: Sie können void foo(void) und __device__ foo (void) deklarieren, 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 einer Geräte- oder 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.


12

Ich werde es mit einem Beispiel erklären:

main() 
{ 
    //Your main function. Executed by CPU 
} 

__global__ void calledFromCpuForGPU(...) 
{ 
    //This function is called by CPU and suppose to be executed on GPU 
} 

__device__ void calledFromGPUforGPU(...) 
{ 
    //This function is called by GPU and suppose to be executed on GPU 
} 

das heißt, wenn wir ein Host (CPU) Funktion aufrufen, eine Vorrichtung (GPU) -Funktion wollen, dann 'global' verwendet wird. Lesen Sie dazu: „https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions

Und wenn wir ein Gerät (GPU) -Funktion wollen (und nicht Kernel) einen anderen Kernel-Funktion nennen wir ‚Gerät‘ verwenden. Lesen Sie diese "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

Dies sollte genug sein, um den Unterschied zu verstehen.


5

__global__ Funktion ist die Definition des Kernels. Wann immer es von der CPU aufgerufen wird, wird dieser Kernel auf der GPU gestartet.

Allerdings muss jeder Thread, der diesen Kernel ausführt, möglicherweise wiederholt Code ausführen, zum Beispiel das Austauschen von zwei Ganzzahlen. Daher können wir hier eine Hilfsfunktion schreiben, genau wie in einem C-Programm. Und für Threads, die auf GPU ausgeführt werden, sollte eine Hilfsfunktion als __device__ deklariert werden.

So wird eine Gerätefunktion aus Threads eines Kernels aufgerufen - eine Instanz für einen Thread. Währenddessen wird eine globale Funktion vom CPU-Thread aufgerufen.


6

Ich bin der Aufnahme einige unbegründete Spekulationen hier zur Zeit (ich werde diese später untermauern, wenn ich auf einige maßgebliche Quelle kommen) ...

  1. __device__ Funktionen können einen Rückgabetyp andere als ungültig, aber __global__ Funktionen müssen immer void zurückgeben.

  2. __global__ Funktionen können aus anderen Kernel aufgerufen werden auf dem GPU Ausführen von zusätzlichem GPU Threads zu starten (als Teil des dynamischen CUDA Parallelismus Modells (auch bekannt als CNP)), während __device__ Funktionen auf demselben Thread als rufende Kernel.


2

globale Funktion kann nur vom Host genannt werden, und sie haben keinen Rückgabetyp, während Funktion des Gerätes nur von Kernfunktion von anderer Gerätefunktion daher dosen't Kernel erfordert aufgerufen werden kann Einstellung


5

__golbal__ ist ein CUDA C Schlüsselwort (Erklärung Spezifizierer), die besagt, daß die Funktion,

  1. Führt auf Vorrichtung (GPU)
  2. Anrufe von Host (CPU) Code.

globale Funktionen (Kernel) durch den Host-Code gestartet mit < < < no_of_blocks, no_of threads_per_block >>>. Jeder Thread führt den Kernel anhand seiner eindeutigen Thread-ID aus.

Aber __device__ Funktionen können nicht vom Host aufgerufen werden code.if Sie es beide __host____device__


11
  1. __global__ verwenden tun müssen, um - Läuft auf der GPU, von der CPU aufgerufen. Ausgeführt mit <<<dim3>>> Argumente.
  2. __device__ - Läuft auf der GPU, von der GPU aufgerufen. Kann auch mit Variabiles verwendet werden.
  3. __host__ - Läuft auf der CPU, von der CPU aufgerufen.
+1

Diese Antwort ist ein bisschen zu spät - sie war zu der Zeit, als die Frage gestellt wurde, richtig, aber seit der Erfindung von [dynamischer Parallelismus] (https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamische Parallelität 12 sep. 162016-09-12 11:47:03