Diferencia entre funciones globales y de dispositivo

108

¿Alguien puede describir las diferencias entre __global__y __device__?

¿Cuándo debo usar __device__y cuándo usar __global__?

Mehdi Saman Booy
fuente

Respuestas:

136

Las funciones globales también se denominan "núcleos". Son las funciones que puede llamar desde el lado del host utilizando la semántica de llamada del núcleo CUDA ( <<<...>>>).

Las funciones del dispositivo solo se pueden llamar desde otro dispositivo o funciones globales. __device__las funciones no se pueden llamar desde el código de host.

Eugenio
fuente
14
Solo como un apéndice, las __global__funciones también se pueden llamar desde el dispositivo usando la semántica del kernel CUDA (<<< ... >>>) si está usando el paralelismo dinámico, que requiere CUDA 5.0 y capacidad de cálculo 3.5 o superior.
Tom
39

Las diferencias entre funciones __device__y __global__son:

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

__global__ Las funciones se pueden llamar desde el host y se ejecutan en el dispositivo.

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

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

FacundoGFlores
fuente
31
  1. __global__- Se ejecuta en la GPU, llamado desde la CPU o la GPU *. Ejecutado con <<<dim3>>>argumentos.
  2. __device__- Se ejecuta en la GPU, llamado desde la GPU. También se puede utilizar con variantes.
  3. __host__ - Se ejecuta en la CPU, llamado desde la CPU.

*) Las __global__funciones se pueden llamar desde otras __global__funciones a partir de la
capacidad de cálculo 3.5.

Greşanu Emanuel - Vasile
fuente
5
Esta respuesta es un poco tarde: era correcta en el momento en que se hizo la pregunta, pero ya no es correcta desde la invención del paralelismo dinámico .
tera
16

Te 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), entonces 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) (en lugar de kernel) llame a otra función de kernel, usamos ' dispositivo '. Lea este " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

Esto debería ser suficiente para comprender la diferencia.

sandeep.ganage
fuente
13

__global__es para kernels cuda, funciones que se pueden llamar directamente desde el host. __device__las funciones se pueden llamar desde __global__y __device__functions pero no desde el host.

perreal
fuente
7

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

  1. __device__las funciones pueden tener un tipo de retorno distinto de void pero las __global__funciones siempre deben devolver void.

  2. __global__Las funciones se pueden llamar desde otros núcleos que se ejecutan en la GPU para lanzar subprocesos de GPU adicionales (como parte del modelo de paralelismo dinámico CUDA (también conocido como CNP)) mientras que las __device__funciones se ejecutan en el mismo subproceso que el kernel que realiza la llamada.

Autodidacta
fuente
7

__global__función es la definición de kernel. Siempre que se llama desde la CPU, ese kernel se inicia en la GPU.

Sin embargo, cada hilo que ejecuta ese kernel puede requerir la ejecución de algún código una y otra vez, por ejemplo, el intercambio de dos enteros. Por lo tanto, aquí podemos escribir una función auxiliar, tal como lo hacemos en un programa en C. Y para los subprocesos que se ejecutan en la GPU, una función auxiliar debe declararse como __device__.

Por lo tanto, se llama a una función de dispositivo desde subprocesos de un kernel: una instancia para un subproceso. Mientras, se llama a una función global desde el subproceso de la CPU.

Lorin Ahmed
fuente
7

__global__ 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 de host (CPU).

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

Sin embargo, las __device__funciones no se pueden llamar desde el código host. Si necesita hacerlo, use ambos __host__ __device__.

Thilina Piyadasun
fuente
2

La función global solo se puede llamar desde el host y no tienen un tipo de retorno, mientras que la función de dispositivo solo se puede llamar desde la función del kernel de otra función del dispositivo, por lo tanto, no requiere la configuración del kernel

harishbisht29
fuente