[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 núcleo. 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__ ?




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.




__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__




  1. __global__ : se ejecuta en la GPU, llamada desde la CPU. Ejecutado con argumentos <<<dim3>>> .
  2. __device__ : se ejecuta en la GPU, llamada desde la GPU. Puede ser utilizado con variabiles también.
  3. __host__ - Se ejecuta en la CPU, llamada desde la CPU.




Tags