CUDA - Multiprocesadores, tamaño de deformación e hilos máximos por bloque: ¿Cuál es la relación exacta?

Sé que hay multiprocesadores en una GPU CUDA que contienen núcleos CUDA en ellos. En mi lugar de trabajo, estoy trabajando con una GTX 590, que contiene 512 núcleos CUDA, 16 multiprocesadores y que tiene un tamaño de urdimbre de 32. Así que esto significa que hay 32 núcleos CUDA en cada multiprocesador que funciona exactamente en el mismo código en la misma urdimbre . Y, finalmente, el máximo de hilos por tamaño de bloque es 1024.

Mi pregunta es cómo se relacionan exactamente el tamaño de bloque y el recuento de multiprocesador - tamaño de deformación. Permítame decirle que entiendo la situación: por ejemplo, asigno N bloques con el tamaño máximo de threadPerBlock de 1024 en la GTX 590. Por lo que entiendo de la guía de programación de CUDA y de otras fuentes, los bloques primero son enumerados por el hardware . En este caso 16 de los N bloques se asignan a diferentes multiprocesadores. Cada bloque contiene 1024 subprocesos y el programador de hardware asigna 32 de estos subprocesos a los 32 núcleos en un solo multiprocesador. Los hilos en el mismo multiprocesador (warp) procesan la misma línea del código y usan la memoria compartida del multiprocesador actual. Si los 32 subprocesos actuales encuentran una operación fuera del chip como las lecturas y escrituras en la memoria, se reemplazan con otro grupo de 32 subprocesos del bloque actual. Por lo tanto, en realidad hay 32 hilos en un solo bloque que sonexactamente ejecutándose en paralelo en un multiprocesador en un momento dado, no en la totalidad del 1024. Finalmente, si un multiprocesador procesa completamente un bloque, se conecta un nuevo bloque de subproceso de la lista de N bloques de subprocesos en el multiprocesador actual. Y, finalmente, hay un total de 512 subprocesos que se ejecutan en paralelo en la GPU durante la ejecución del kernel CUDA. (Sé que si un bloque usa más registros que los disponibles en un solo multiprocesador, entonces se divide para funcionar en dos multiprocesadores, pero supongamos que cada bloque puede caber en un solo multiprocesador en nuestro caso).

Entonces, ¿es correcto mi modelo de ejecución paralela de CUDA? Si no, ¿qué está mal o falta? Quiero ajustar el proyecto actual en el que estoy trabajando, por lo que necesito el modelo de trabajo más correcto de todo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta