Respuesta directa: El tamaño de deformación es el número de hilos en una urdimbre, que es una subdivisión utilizada en la implementación de hardware para combinar el acceso a la memoria y el despacho de instrucciones.
Lectura sugerida:
Como @Matias mencionado, me gustaría ir leyó el CUDA C Best Practices Guide (que tendrá que desplazarse hasta la parte inferior, donde aparece en la lista). Podría ayudar para que usted pueda mirar a la tabla en el Apéndice G.1 en la página 164.
Explicación:
CUDA es el lenguaje que proporciona el paralelismo en dos niveles. Tienes hilos y tienes bloques de hilos. Esto es más evidente cuando ejecuta un kernel; debe especificar el tamaño de cada bloque de hilos y el número de bloques de hilos entre < < < >>> que preceden a los parámetros del núcleo.
Lo que CUDA no dice es que las cosas están sucediendo realmente en cuatro niveles, no en dos. En el fondo, su bloque de hilos se divide en subbloques llamados "warps". He aquí una breve metáfora para ayudar a explicar lo que realmente está pasando:
Breve metáfora:
simular que eres un educador/investigador/político que esté interesado en la habilidad matemática actual del último año de secundaria. Tu plan es dar una prueba a 10,240 estudiantes, pero no puedes simplemente ponerlos a todos en un estadio de fútbol o algo así y darles la prueba. Es más fácil subdividir (poner en paralelo) su colección de datos, por lo que debe ir a 20 escuelas secundarias diferentes y solicitar que 512 de sus estudiantes de cuarto año rindan la prueba de matemáticas.
Recoges tus datos y eso es todo lo que te importa.Lo que no sabía (y no le importó a realmente) es que cada escuela en realidad se subdivide en aulas. Entonces, sus 512 adultos mayores están divididos en 16 grupos de 32. Además, ninguna de estas escuelas tiene realmente los recursos necesarios: cada aula solo tiene dieciséis calculadoras. Por lo tanto, en cualquier momento, solo la mitad de cada aula puede tomar su examen de matemáticas.
Podría seguir para estirar las reglas tontas, ya que solo ocho aulas en una escuela pueden tomar el examen al mismo tiempo porque solo tienen ocho maestros. No se puede probar más de 30 escuelas al mismo tiempo, ya que sólo tiene 30 procuradores ...
Volver a su pregunta:
El uso de la metáfora, el programa quiere calcular resultados tan rápido como sea posible (se querer coleccionar pruebas de matemáticas). Usted emite un kernel con un cierto número de bloques (escuelas) cada uno de los cuales tiene un cierto número de hilos (estudiantes). Solo puede tener tantos bloques ejecutándose al mismo tiempo (recopilar las respuestas de su encuesta requiere un supervisor por escuela). En CUDA, los bloques de subprocesos se ejecutan en un multiprocesador de transmisión (SM). La variable: CL_DEVICE_MAX_COMPUTE_UNITS
le dice cuántos SMs, , tiene una tarjeta específica. Esto varía drásticamente en función del hardware; consulte la tabla en el Apéndice A del CUDA C Best Practices Guide. Tenga en cuenta que cada SM puede ejecutar solo ocho bloques simultáneamente independientemente de la capacidad de cómputo (1.X o 2.X).
Los bloques de rosca tienen las dimensiones máximas: CL_DEVICE_MAX_WORK_ITEM_SIZES
. Piensa en desplegar tus hilos en una grilla; no puede tener una fila con más de hilos. No puede tener una columna con más de hilos. Y no puede apilar más de subprocesos. A continuación, hay un número máximo de CL_DEVICE_MAX_WORK_GROUP_SIZE
, , que se pueden agrupar en un bloque. Por lo tanto las dimensiones de sus secuencias de rosca podrían ser:
512 x 1 x 1
1 x 512 x 1
4 x 2 x 64
64 x 8 x 1
etc. ...
Tenga en cuenta que a partir de Compute Capability 2.X, sus bloques pueden tener un máximo de 1024 hilos. Por último, la variable CL_NV_DEVICE_WARP_SIZE
especifica el tamaño de la urdimbre, (número de estudiantes por aula). En dispositivos Compute Capability 1.X, las transferencias de memoria y el despacho de instrucciones se producen en el Half-Warp granularidad (solo tiene 16 calculadoras por aula). En Compute Capability 2.0, las transferencias de memoria se agrupan por Warp, por lo que 32 recuperaciones al mismo tiempo, pero el despacho de instrucciones solo se agrupará por Half-Warp. Para Compute Capability 2.1, las transferencias de memoria y se envían por Warp, 32 hilos. Estas cosas pueden cambiar y cambiarán en el hardware futuro.
Entonces, mi palabra!Vamos al grano:
En resumen:
he descrito los matices de la urdimbre/diseño de hilo y otros tales Shtuff, pero aquí hay un par de cosas a tener en cuenta. Primero, su acceso a la memoria debe ser "agrupable" en conjuntos de 16 o 32. Así que mantenga la dimensión X de sus bloques un múltiplo de 32. En segundo lugar, y la más importante para obtener el máximo provecho de una GPU específica, necesita maximizar ocupación. No tiene 5 bloques de 512 hilos. Y no tiene 1,000 bloques de 10 hilos. Me gustaría fuertemente recomendar ver el Excel-based spreadsheet (¿funciona también en OpenOffice?) Que le dirá cuál será la ocupación de la GPU para una llamada específica del kernel (disposición de subprocesos y requisitos de memoria compartida). ¡Espero que esta explicación ayude!
Muy buena respuesta y metáfora. Solo quiero agregar que AMD tiene una noción similar llamada Wavefront, y actualmente tiene 64 hilos/frente de onda. – Stringer
Huh. No lo sabía. No he pasado mucho tiempo mirando las ofertas de AMD. ¿Tiene una idea de si esto cambiará drásticamente con las ofertas de Fusion? –
Las futuras piezas de fusión se basan todas en la arquitectura Evergreen, por lo que las líneas de onda deben permanecer en 64 subprocesos: http://www.highperformancegraphics.org/media/Hot3D/HPG2010_Hot3D_AMD.pdf – Stringer