He estado usando CUDA durante algunas semanas, pero tengo algunas dudas sobre la asignación de bloques/warps/hilo. Estoy estudiando la arquitectura desde el punto de vista didáctico (proyecto de la universidad), por lo que no es mi preocupación alcanzar el máximo rendimiento.¿Cómo se mapean/deforman/hilos CUDA en núcleos CUDA?
En primer lugar, me gustaría entender si tengo estas cosas claras:
El programador escribe un núcleo, y organizar su ejecución en una rejilla de hilo se bloquea.
Cada bloque se asigna a un multiprocesador de transmisión (SM). Una vez asignado, no puede migrar a otro SM.
Cada SM divide sus propios bloques en Warps (actualmente con un tamaño máximo de 32 hilos). Todos los hilos en una urdimbre se ejecutan simultáneamente en los recursos de la SM.
La ejecución real de un hilo es realizada por los núcleos CUDA contenidos en el SM. No hay una asignación específica entre hilos y núcleos.
Si una urdimbre contiene 20 hilos, pero actualmente solo hay 16 núcleos disponibles, la urdimbre no se ejecutará.
Por otro lado, si un bloque contiene 48 subprocesos, se dividirá en 2 distorsiones y se ejecutarán en paralelo siempre que haya suficiente memoria disponible.
Si un subproceso se inicia en un núcleo, luego se detiene para acceso a la memoria o para una operación de coma flotante larga, su ejecución podría reanudarse en un núcleo diferente.
¿Son correctos?
Ahora, tengo una GeForce 560 Ti por lo que de acuerdo con las especificaciones está equipada con 8 SM, cada uno con 48 núcleos CUDA (384 núcleos en total).
Mi objetivo es asegurarse de que cada núcleo de la arquitectura ejecuta las instrucciones MISMAS. Suponiendo que mi código no requerirá más registro de los que están disponibles en cada SM, que imaginaron diferentes enfoques:
que crear 8 bloques de 48 hilos cada uno, de manera que cada SM tiene 1 bloque a ejecutar. En este caso, ¿los 48 hilos se ejecutarán en paralelo en el SM (explotando los 48 núcleos disponibles para ellos)?
¿Hay alguna diferencia si pongo en marcha 64 bloques de 6 hilos? (Suponiendo que se asignarán de manera uniforme entre los SM)
Si "sumerjo" la GPU en el trabajo programado (creando 1024 bloques de 1024 subprocesos cada uno, por ejemplo) es razonable suponer que todos los núcleos serán utilizado en un cierto punto, y realizará los mismos cálculos (suponiendo que los hilos nunca se detengan)?
¿Hay alguna manera de comprobar estas situaciones utilizando el generador de perfiles?
¿Hay alguna referencia para estas cosas?Leí la guía de programación de CUDA y los capítulos dedicados a la arquitectura de hardware en "Programación de procesadores masivamente paralelos" y "Diseño y desarrollo de aplicaciones CUDA"; pero no pude obtener una respuesta precisa.
Gracias por su respuesta. Leí las referencias, pero hay algunas cosas que no entiendo en su respuesta.En las siguientes preguntas, supongo que estamos utilizando una arquitectura de Fermi con 48 núcleos (16 núcleos * 3 "grupos principales"): 1. Usted mencionó un mapeo entre los núcleos y laneid. ¿Qué tipo de mapeo es? 2. De las referencias que obtuve, cada "grupo núcleo" ejecuta a lo sumo un medio warp (16 hilos) por ciclo de reloj. Entonces, en teoría, si tenemos 48 hilos en el mismo bloque, se organizarán en 3 medias urdimbres y se ejecutarán en paralelo en los 48 núcleos. ¿Estoy en lo cierto? – Daedalus
Los núcleos CUDA son el número de unidades FP de precisión simple. Pensar en la ejecución en términos de núcleos CUDA no es correcto. Cada urdimbre tiene 32 hilos. Estos hilos se emitirán a un grupo de unidades de ejecución (por ejemplo, 16 núcleos cuda). Para emitir a los 48 núcleos en un solo reloj, uno de los dos planificadores de warp necesita seleccionar un warp que cumpla con el requisito de un par superescalar y ambas instrucciones deben ser de un tipo ejecutado por núcleos CUDA. Además, el otro planificador de warp tiene que elegir un warp cuya siguiente instrucción será ejecutada por núcleos CUDA. –
No es necesario que las urdimbres estén en el mismo bloque o que las urdimbres en un bloque tengan el mismo contador de programa. –