cuda ambito - Diferencia entre funciones globales y de dispositivo





definicion local (9)


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

  1. __device__ funciones de __device__ pueden tener un tipo de retorno distinto de void, pero __global__ funciones __global__ siempre deben volverse anuladas.

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

¿Alguien puede describir las diferencias entre __global__ y __device__ ?

¿Cuándo debo usar __device__ y cuándo usar __global__ ?




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




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), 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) (más bien kernel) llame a otra función de kernel usamos ' device '. Lea esto " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

Esto debería ser suficiente para entender la diferencia.




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




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__ 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. __device__ funciones __device__ pueden __global__ desde las funciones __global__ y __device__ pero no desde el host.




__global__ función __global__ 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, podría requerir ejecutar 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.




Las diferencias entre las funciones __device__ y __global__ son:

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

__global__ funciones pueden ser llamadas desde el host, y se ejecuta en el dispositivo.

Por lo tanto, llama a __device__ funciones __device__ desde las funciones del kernel, y no tiene que establecer las configuraciones 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 se puede __device__ foo (void) 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í.




El Soporte de CUDA / Elegir una GPU sugiere que

al ejecutar un programa CUDA en una máquina con múltiples GPU, los núcleos CUDA se ejecutarán de manera predeterminada en cualquier GPU instalada en la ranura de la tarjeta gráfica principal.

Además, la discusión en No GPU seleccionado, el código funciona correctamente, ¿cómo es esto posible? sugiere que CUDA no asigna la "mejor" tarjeta al dispositivo 0 en general.

EDITAR

Hoy he instalado una PC con una tarjeta Tesla C2050 para computación y una tarjeta 8084 GS para visualización cambiando su posición entre las dos primeras ranuras PCI-E. He utilizado deviceQuery y he notado que la GPU 0 es siempre la primera ranura PCI y la GPU 1 que la segunda ranura PCI. No sé si esto es una declaración general, pero es una prueba de que para mi sistema las GPU no están numeradas de acuerdo con su "poder", sino de acuerdo con sus posiciones.





cuda