[cuda] Differenza tra funzioni globali e dispositivo


Answers

Le differenze tra le funzioni __device__ e __global__ sono:

__device__ funzioni __device__ possono essere chiamate solo dal dispositivo e vengono eseguite solo nel dispositivo.

__global__ funzioni __global__ possono essere richiamate dall'host e vengono eseguite nel dispositivo.

Pertanto, chiamate __device__ funzioni __device__ dalle funzioni dei kernel e non è necessario impostare le impostazioni del kernel. Puoi anche "sovraccaricare" una funzione, ad esempio: puoi dichiarare void foo(void) e __device__ foo (void) , quindi uno viene eseguito sull'host e può essere chiamato solo da una funzione host. L'altro viene eseguito sul dispositivo e può essere chiamato solo da una funzione del dispositivo o del kernel.

Puoi anche visitare il seguente link: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , è stato utile per me.

Question

Qualcuno può descrivere le differenze tra __global__ e __device__ ?

Quando dovrei usare __device__ e quando usare __global__ ?.




Sto registrando qui alcune speculazioni infondate (cercherò di sostenerle più tardi quando incontrerò una fonte autorevole) ...

  1. __device__ funzioni __device__ possono avere un tipo di ritorno diverso da void ma __global__ funzioni __global__ devono sempre restituire void.

  2. __global__ funzioni __global__ possono essere richiamate da altri kernel in esecuzione sulla GPU per avviare ulteriori thread GPU (come parte del modello di parallelismo dinamico CUDA (noto anche come CNP)) mentre __device__ funzioni __device__ eseguite sullo stesso thread del kernel chiamante.




Lo spiegherò con un esempio:

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
}

cioè quando vogliamo che una funzione host (CPU) chiami una funzione di dispositivo (GPU), allora viene usato ' global '. Leggi questo: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

E quando vogliamo una funzione di dispositivo (GPU) (piuttosto kernel) per chiamare un'altra funzione del kernel usiamo " dispositivo ". Leggi questo " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

Questo dovrebbe essere sufficiente per capire la differenza.




__golbal__ è una parola chiave CUDA C (specificatore di dichiarazione) che dice che la funzione,

  1. Esegui sul dispositivo (GPU)
  2. Chiamate dal codice host (CPU).

funzioni globali (kernel) lanciate dal codice host usando <<< no_of_blocks, no_of threads_per_block >>>. Ogni thread esegue il kernel con il suo ID di thread univoco.

Ma le funzioni __device__ non possono essere chiamate dal codice host. Se è necessario farlo, usa entrambi __host__ __device__





Tags

cuda