¿Alguien puede describir las diferencias entre __global__
y __device__
?
¿Cuándo debo usar __device__
y cuándo usar __global__
?
¿Alguien puede describir las diferencias entre __global__
y __device__
?
¿Cuándo debo usar __device__
y cuándo usar __global__
?
Respuestas:
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.
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í.
__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 la
capacidad de cálculo 3.5.
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.
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.
__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.
__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__
.
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
__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.