2010-08-31 16 views
38

¿Cuál es la relación entre el tamaño máximo de grupo de trabajo y el tamaño de urdimbre? Digamos que mi dispositivo dispone de 240 procesadores CUDA de streaming (SP) y devuelve la siguiente información -Modelo CUDA: ¿cuál es el tamaño de la urdimbre?

CL_DEVICE_MAX_COMPUTE_UNITS: 30

CL_DEVICE_MAX_WORK_ITEM_SIZES: 512/512/64

CL_DEVICE_MAX_WORK_GROUP_SIZE: 512

CL_NV_DEVICE_WARP_SIZE: 32

Esto significa que tiene ocho SP por multiprocesador de transmisión (es decir, unidad de cálculo). Ahora, ¿cómo se relaciona el tamaño de la urdimbre = 32 con estos números?

Respuesta

3

El tamaño de la urdimbre es el número de subprocesos que un multiprocesador ejecuta al mismo tiempo. Un multiprocesador de NVIDIA puede ejecutar varios subprocesos desde el mismo bloque al mismo tiempo, utilizando hardware multihilo.

Es importante tener en cuenta el tamaño de la urdimbre, ya que todos los accesos a la memoria se fusionan en múltiplos del tamaño de la urdimbre (32 bytes, 64 bytes, 128 bytes) y esto mejora el rendimiento.

El CUDA C Best Practices Guide contiene toda la información técnica sobre este tipo de optimizaciones.

107

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!

+2

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

+0

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? –

+0

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

0

La respuesta directa es breve: en Nvidia, los BLOQUES compuestos por HILOS son establecidos por el programador, y WARP es 32 (consta de 32 hilos), que es la unidad mínima que ejecuta la unidad de cálculo al mismo tiempo. En AMD, WARP se llama WAVEFRONT ("onda").

En OpenCL, WORKGROUPs significa BLOCK en CUDA, y lo que es más, WORKITEMs significa THREADs en CUDA.

+0

Esta es una respuesta informativa en algún nivel; sin embargo, en realidad no nos dice acerca de las urdimbres y cómo incluirlas al escribir el código. Como dijo una vez Richard Feynmann, "conocer el nombre de algo no significa que lo entiendas". Para enseñar bien, debes explicar cómo funciona o se usa algo. –

Cuestiones relacionadas