¿Alguien puede describir las diferencias entre __global__
y __device__
?Diferencia entre funciones globales y de dispositivo
¿Cuándo debo usar __device__
, y cuándo usar __global__
?.
¿Alguien puede describir las diferencias entre __global__
y __device__
?Diferencia entre funciones globales y de dispositivo
¿Cuándo debo usar __device__
, y cuándo usar __global__
?.
Las funciones globales también se denominan "kernels". Son las funciones a las que puede llamar desde el lado del host usando la semántica de llamadas al kernel de CUDA (<<<...>>>
).
Las funciones del dispositivo solo se pueden llamar desde otro dispositivo o funciones globales. __device__
funciones no se pueden llamar desde el código de host.
__global__
es para núcleos cuda, funciones que se pueden llamar desde el host directamente. Las funciones __device__
se pueden llamar desde las funciones __global__
y __device__
pero no desde el host.
Diferencias entre __device__
y __global__
funciones son:
__device__
funciones se pueden llamar solamente desde el dispositivo, y sólo se ejecuta en el dispositivo.
__global__
funciones se pueden llamar desde el host, y se ejecuta en el dispositivo.
Por lo tanto, llama a las funciones __device__
de las funciones del núcleo, 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)
, luego se ejecuta uno en el host y solo puede invocarse 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í.
voy a 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 una función de host (CPU) para llamar a una función de dispositivo (GPU), luego 'mundial' se utiliza. Leer esto: "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"
Y cuando queremos una función del dispositivo (GPU) (en lugar del núcleo) para llamar a otra función del núcleo usamos 'dispositivo'. Lea esto "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"
Esto debería ser suficiente para entender la diferencia.
__global__
function es la definición de kernel. Cada vez que se llama desde la CPU, ese núcleo se inicia en la GPU.
Sin embargo, cada subproceso que ejecute 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 C. Y para los hilos que se ejecutan en la GPU, una función auxiliar debe declararse como __device__
.
Por lo tanto, una función del dispositivo se llama desde hilos de un kernel, una instancia para un hilo. Mientras, una función global se llama desde el hilo de la CPU.
estoy grabando algunas especulaciones sin fundamento aquí por el momento (voy a corroborar estos más tarde, cuando me encuentro con alguna fuente autorizada) ...
__device__
funciones pueden tener un tipo de retorno que no sea vacío, sino __global__
las funciones siempre deben volverse anuladas.
__global__
funciones se pueden llamar desde dentro de otros granos que se ejecutan en la GPU para poner en marcha las discusiones GPU adicionales (como parte de CUDA modelo dinámico paralelismo (también conocido como CNP)), mientras que __device__
funciones se ejecutan en la misma rosca que el núcleo llamado.
Función global sólo puede ser llamado desde el anfitrión y que no tienen un tipo de retorno, mientras Función del dispositivo sólo puede ser llamado desde la función del núcleo de otra función de dispositivo de ahí dosis no requiere el establecimiento del núcleo
__golbal__
es una palabra clave CUDA C (especificador de declaración), que dice que la función,
funciones globales (núcleos) lanzada por el código de host mediante < < < no_of_blocks, no_of threads_per_block >>>. Cada subproceso ejecuta el kernel por su ID de subproceso único.
Pero __device__
funciones no pueden ser llamados desde el host code.if lo que necesita hacer es utilizar ambos __host__
__device__
__global__
- Se ejecuta en la GPU, llamados desde la CPU. Ejecutado con <<<dim3>>>
argumentos.__device__
- Se ejecuta en la GPU, llamada desde la GPU. Puede ser utilizado con variabiles también.__host__
- Se ejecuta en la CPU, llamada desde la CPU.Esta respuesta es demasiado tarde: era correcta en el momento en que se hizo la pregunta, pero ya no es correcta desde la invención de [paralelismo dinámico] (https://devblogs.nvidia.com/parallelforall/introduction-cuda -dynamic-paralelismo /). – tera
Así como un apéndice, '__global__' funciones también pueden ser llamados desde el dispositivo mediante la semántica del núcleo CUDA (<<<...> >>) si está utilizando el paralelismo dinámico - que requiere CUDA 5.0 y capacidad de cómputo 3.5 o superior. – Tom