2012-08-22 15 views
9

Estoy confundido acerca del número máximo de subprocesos que se pueden iniciar en una GPU de Fermi.Número máximo de subprocesos que se pueden iniciar en un único kernel CUDA

Mi consulta del dispositivo GTX 570 dice lo siguiente.

Maximum number of threads per block:   1024 
    Maximum sizes of each dimension of a block: 1024 x 1024 x 64 
    Maximum sizes of each dimension of a grid:  65535 x 65535 x 65535 

Desde mi entender, entiendo la afirmación anterior como:

para un kernel CUDA podemos poner en marcha en la mayoría de 65536 bloques. Cada bloque lanzado puede contener hasta 1024 hilos. Por lo tanto, en principio, puedo lanzar hasta 65536 * 1024 (= 67108864) hilos.

¿Es esto correcto? ¿Qué pasa si mi hilo usa mucho registros? ¿Seguiremos siendo capaces de alcanzar este máximo teórico de la cantidad de hilos?

Después de escribir y ejecutar el kernel CUDA, ¿cómo sé que el número de subprocesos y bloques que he lanzado tiene de hecho se ha instanciado. Quiero decir que no quiero que la GPU calcule algo de basura, o se comporte de manera extraña, si por casualidad he creado más hilos de lo que es posible para ese núcleo en particular.

+0

Esto puede ayudarlo: http://stackoverflow.com/questions/2392250/understanding-cuda-grid-dimensions-block-dimensions-and-threads-organization-s – user1154664

Respuesta

17

Para un kernel CUDA podemos lanzar como máximo 65536 bloques. Cada bloque lanzado puede contener hasta 1024 hilos. Por lo tanto, en principio, puedo lanzar hasta 65536 * 1024 (= 67108864) hilos.

No, esto no es correcto. Puede lanzar una grilla de hasta 65535 x 65535 x 65535 bloques, y cada bloque tiene un máximo de 1024 hilos por bloque, aunque la limitación de recursos por hilo puede restringir el número total de hilos por bloque a menos de este máximo.

¿Qué pasa si mi hilo usa un montón de registros? ¿Seguiremos siendo capaces de alcanzar el este máximo teórico de la cantidad de hilos?

No, no podrá alcanzar los hilos máximos por bloque en este caso. Cada versión del juego de herramientas NVIDIA CUDA incluye una hoja de cálculo de ocupación que puede usar para ver el efecto de la presión de registro en el tamaño del bloque limitante.

Además, después de escribir y el lanzamiento del kernel CUDA, ¿cómo sé que el número de hilos y los bloques que he puesto en marcha haber sido hecho instanciado. Quiero decir que no quiero que la GPU calcule algo de basura, o se comporta de forma extraña, si por casualidad he creado más hilos que posible para ese núcleo en particular.

Si elige una configuración de ejecución ilegal (de modo incorrecto tamaño de bloque o tamaño de la cuadrícula), el kernel no poner en marcha y el tiempo de ejecución emitirá un mensaje de error cudaErrorInvalidConfiguration. Puede usar el estándar cudaPeekAtLastError() y cudaGetLastError() para verificar el estado de cualquier inicio del kernel.

Cuestiones relacionadas