2010-02-05 15 views
16

estoy teniendo la comprensión de las discusiones en la arquitectura GPU NVIDIA CUDA con algunas dificultades.me ayudan a entender CUDA

cualquiera podría aclarar esta información: una 8800 gpu tiene 16 SM con 8 SP cada uno. entonces tenemos 128 SP.

yo estaba viendo el video de presentación de Stanford y se decía que cada SP es capaz de ejecutar 96 hilos cuncurrently. ¿Esto significa que (SP) puede ejecutar 96/32 = 3 warps al mismo tiempo?

por otra parte, ya que cada SP puede ejecutar 96 hilos y tenemos 8 SP en cada SM. ¿Esto significa que cada SM puede ejecutar 96 * 8 = 768 hilos al mismo tiempo? pero si cada SM puede ejecutar un solo bloque a la vez, y el número máximo de subprocesos en un bloque es de 512, por lo cual es el propósito de ejecutar 768 hilos al mismo tiempo y tener un máximo de 512 hilos?

una pregunta más general es: ¿cómo son bloques, hilos, y deformaciones distribuye a los SM y SP? He leído que cada SM consigue un solo bloque para ejecutar a la vez y las discusiones en un bloque se divide en hilos de urdimbre (32 hilos), y SP ejecuto urdimbres.

+1

Espero haber explicado en mi respuesta, pero un punto importante es que cada SM puede ejecutar más de un bloque en un momento dado. Además, el número 96 es una pista falsa, no vale la pena preocuparse por los hilos por SP, solo preocúpate por los hilos por SM y deja que el hardware maneje los detalles más finos. – Tom

Respuesta

2

Al principio es un poco confuso, pero ayuda saber que cada SP hace algo así como SMT de 4 vías: recorre cuatro hilos, emitiendo una instrucción por reloj, con una latencia de 4 ciclos en cada instrucción. Así es como obtienes 32 hilos por urdimbre en 8 SP.

En lugar de pasar por todo el resto de las cosas con las urdimbres, bloques, hilos, etc, te referiré a la nVidia CUDA Forums, donde este tipo de pregunta surge regularmente y ya hay algunas buenas explicaciones.

48

Debe retirar la webinars en el sitio web de NVIDIA, puede unirse a una sesión en vivo o ver las sesiones pregrabadas. A continuación se muestra una visión general rápida, pero altamente recomendable ver los seminarios web, que realmente van a ayudar como se puede ver los diagramas y se lo expliquen al mismo tiempo.

Cuando se ejecuta una función (un núcleo) en una GPU es ejecuta como una cuadrícula de bloques de hilos .

  • A hilo es la granularidad más fina, cada hilo tiene un identificador único dentro del bloque (threadIdx) que se utiliza para seleccionar los datos para operar. El hilo puede tener un número relativamente grande de registros y también tiene un área privada de memoria conocida como memoria local que se utiliza para el archivo de registros y las grandes variables automáticas.
  • A bloque es un grupo de hilos que ejecutan conjuntamente en un lote. La razón principal para este nivel de granularidad es que los hilos dentro de un bloque pueden cooperar comunicándose usando la memoria compartida rápida. Cada bloque tiene un identificador único (blockIdx) que, junto con threadIdx, se usa para seleccionar datos.
  • A rejilla es un conjunto de bloques que en conjunto ejecutar la operación de GPU.

Esa es la jerarquía lógica. En realidad, solo necesita comprender la jerarquía lógica para implementar una función en la GPU; sin embargo, para obtener rendimiento, debe comprender también el hardware que es SM y SP.

Una GPU se compone de SM, y cada SM contiene una cantidad de SP. Actualmente hay 8 SP por SM y entre 1 y 30 SM por GPU, pero en realidad el número real no es una preocupación importante hasta que estás realmente avanzado.

El primer punto a considerar para el rendimiento es el de warps. Un warp es un conjunto de 32 hilos (si tiene 128 hilos en un bloque (por ejemplo), los hilos 0-31 estarán en un warp, 32-63 en el siguiente y así sucesivamente. Warp es muy importante por algunas razones , siendo los más importantes:

  • Hilos dentro de una urdimbre están unidos, si un hilo dentro de una urdimbre se va por el lado 'si' de un bloque if-else y los otros vaya por el 'más', entonces de hecho, los 32 hilos descenderán por ambos lados. Funcionalmente no hay problema, los hilos que no deberían haber ocupado la rama están deshabilitados, por lo que siempre obtendrás el resultado correcto, pero si ambos lados son largos, entonces la penalización del rendimiento es importante
  • Hilos dentro de una urdimbre (en realidad a la mitad de la disformidad, pero si lo haces bien para warps entonces estás a salvo en la próxima generación también) recuperar datos de la memoria, por lo que si puede asegurarse de que todos los hilos recuperen datos dentro del mismo "segmento", entonces solo pagará una transacción de memoria y si todos obtienen de direcciones aleatorias, entonces pagará 32 transacciones de memoria. Consulte la presentación Advanced CUDA C para obtener detalles sobre esto, ¡pero solo cuando esté listo!
  • Los hilos dentro de una urdimbre (una vez más a la mitad de la curva en las GPU actuales) acceden a la memoria compartida y si no tienes cuidado tendrás 'conflictos bancarios' donde los hilos deben colapsarse uno detrás de otro para acceder a las memorias.

Haber entendido lo que es una distorsión, el punto final es cómo los bloques y la cuadrícula se asignan a la GPU.

Cada bloque se iniciará en un SM y permanecerá allí hasta que se haya completado. Tan pronto como se haya completado, se retirará y se podrá lanzar otro bloque en el SM. Es esta programación dinámica la que otorga a las GPU la capacidad de ampliación: si tiene una SM, todos los bloques se ejecutarán en la misma SM en una gran cola, si tiene 30 SM, los bloques se programarán dinámicamente en los SM. Por lo tanto, debe asegurarse de que cuando ejecute una función de GPU, su cuadrícula esté compuesta por una gran cantidad de bloques (al menos cientos) para garantizar que se escale a través de cualquier GPU.

El punto final es que un SM puede ejecutar más de un bloque en un momento dado. Esto explica por qué un SM puede manejar 768 subprocesos (o más en algunas GPU) mientras que un bloque solo tiene hasta 512 subprocesos (actualmente). Esencialmente, si el SM tiene los recursos disponibles (registros y memoria compartida), tomará bloques adicionales (hasta 8). La hoja de cálculo de la calculadora de ocupación (incluida con el SDK) lo ayudará a determinar cuántos bloques se pueden ejecutar en cualquier momento.

Lo siento por el vertedero de cerebros, mire los webinars, ¡será más fácil!

+3

+1 Respuesta bien escrita e informativa :) – Sekhat

+0

¡Excelente y completa respuesta! – Jake0x32

+0

@Tom: Varias cosas han cambiado desde 2010, ¿podría actualizar varios números en su respuesta (especialmente el último párrafo)? Eso sería realmente tan útil para nosotros. – skm

Cuestiones relacionadas