Pregunta Diferencia entre funciones globales y de dispositivo


¿Alguien puede describir las diferencias entre __global__ y __device__ ?

Cuando debería usar __device__y cuando usar __global__?.


74
2017-09-11 16:15


origen


Respuestas:


Las funciones globales también se llaman "núcleos". Son las funciones a las que puede llamar desde el lado del host utilizando la semántica de llamadas al kernel de 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.


104
2017-09-11 16:18



Diferencias entre __device__ y __global__ Las funciones son:

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

__global__ las funciones se pueden llamar desde el host, y se ejecuta en el dispositivo.

Por lo tanto, llamas __device__ funciones de funciones de kernels, 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 uno se ejecuta en el host y solo se puede invocar 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 puedes visitar el siguiente enlace: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, fue útil para mí


33
2017-09-11 16:33



  1. __global__ - Se ejecuta en la GPU, llamada desde la CPU. Ejecutado con <<<dim3>>> argumentos.
  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.

18
2017-09-12 10:58



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 'global'es usado. Lee esto: "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"

Y cuando queremos una función de dispositivo (GPU) (más bien núcleo) para llamar a otra función de kernel, usamos 'dispositivo'. Lee esto "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

Esto debería ser suficiente para entender la diferencia.


13
2018-02-11 09:49



__global__ es para núcleos cuda, funciones que se pueden llamar desde el host directamente. __device__ funciones pueden ser llamadas desde __global__ y __device__ funciones pero no desde el host.


11
2017-09-11 16:19



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

  1. __device__ las funciones pueden tener un tipo de retorno distinto de vacío, pero __global__ las funciones siempre deben regresar vacías.

  2. __global__ las funciones se pueden llamar desde otros núcleos que se ejecutan en la GPU para iniciar subprocesos de GPU adicionales (como parte del modelo de paralelismo dinámico de CUDA (aka CNP)) mientras __device__ las funciones se ejecutan en el mismo hilo que el kernel que realiza la llamada.


6
2017-10-18 18:56



__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__ no se pueden llamar las funciones desde el código de host. si necesita hacerlo use ambos __host__  __device__


6
2017-07-02 06:04