¿Alguien puede describir las diferencias entre __global__
y __device__
?
¿Cuándo debo usar __device__
y cuándo usar __global__
?
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.
__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.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 declararvoid 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í.
fuente
__global__
- Se ejecuta en la GPU, llamado desde la CPU o la GPU *. Ejecutado con<<<dim3>>>
argumentos.__device__
- Se ejecuta en la GPU, llamado desde la GPU. También se puede utilizar con variantes.__host__
- Se ejecuta en la CPU, llamado desde la CPU.*) Las
__global__
funciones se pueden llamar desde otras__global__
funciones a partir de lacapacidad de cálculo 3.5.
fuente
Te lo explicaré con un ejemplo:
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.
fuente
__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.fuente
Estoy registrando algunas especulaciones infundadas aquí por el momento (las fundamentaré más adelante cuando me encuentre con alguna fuente autorizada) ...
__device__
las funciones pueden tener un tipo de retorno distinto de void pero las__global__
funciones siempre deben devolver void.__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.fuente
__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.
fuente
__global__
es una palabra clave CUDA C (especificador de declaración) que dice que la función,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__
.fuente
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
fuente