[cuda] Diferencia entre funciones globales y de dispositivo



Answers

Las diferencias entre las funciones __device__ y __global__ son:

__device__ funciones __device__ se pueden llamar desde el dispositivo y solo se ejecutan en el dispositivo.

__global__ funciones pueden ser llamadas desde el host, y se ejecuta en el dispositivo.

Por lo tanto, llama a __device__ funciones __device__ desde las funciones del kernel, y no tiene que establecer las configuraciones del kernel. También puede "sobrecargar" una función, por ejemplo: puede declarar void foo(void) y __device__ foo (void) , luego se ejecuta uno en el host y solo se puede __device__ foo (void) desde una función de host. El otro se ejecuta en el dispositivo y solo se puede invocar desde un dispositivo o función kernel.

También puede visitar el siguiente enlace: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions , fue útil para mí.

Question

¿Alguien puede describir las diferencias entre __global__ y __device__ ?

¿Cuándo debo usar __device__ y cuándo usar __global__ ?




__golbal__ es una palabra clave CUDA C (especificador de declaración) que dice que la función,

  1. Se ejecuta en el dispositivo (GPU)
  2. Llamadas desde el código del host (CPU).

funciones globales (kernels) lanzadas por el código de host utilizando <<< no_of_blocks, no_of threads_per_block >>>. Cada subproceso ejecuta el kernel por su ID de subproceso único.

Pero __device__ funciones de __device__ no se pueden llamar desde el código de host. Si necesita hacerlo, use ambos __host__ __device__




Lo explicaré con un ejemplo:

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
}

es decir, cuando queremos que una función de host (CPU) llame a una función de dispositivo (GPU), se usa ' global '. Lea esto: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

Y cuando queremos que una función de dispositivo (GPU) (más bien kernel) llame a otra función de kernel usamos ' device '. Lea esto " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

Esto debería ser suficiente para entender la diferencia.




Estoy registrando algunas especulaciones infundadas aquí por el momento (las verificaré más adelante cuando me encuentre con alguna fuente autorizada) ...

  1. __device__ funciones de __device__ pueden tener un tipo de retorno distinto de void, pero __global__ funciones __global__ siempre deben volverse anuladas.

  2. __global__ funciones __global__ pueden __global__ desde otros núcleos que se ejecutan en la GPU para iniciar subprocesos adicionales de GPU (como parte del modelo de paralelismo dinámico CUDA (aka CNP)) mientras que __device__ funciones __device__ ejecutan en el mismo subproceso que el kernel que realiza la llamada.






Links



Tags

cuda