Dudas cuda, SP, MP y warps

Dudas cuda, SP, MP y warps

de Gaston Daniel Barreto Sugliani -
Número de respuestas: 3

  • La arquitectura Fermi tiene 16  multiprocessors 
  • Cada MP tiene 32 cores, dividido en dos bloques de 16, con un warp scheduler para cada bloque


Entonces la pregunta es

  1. Los bloques del grid se reparten entre los cores o entre los mp? Porque la imagen 1 da a entender que se reparten entre los cores
  2. Con cuantos hilos trabaja un core de forma concurrente? Imagen 2 dice que cada hilo se ejecuta en un core, como un warp tiene 32 hilos podría darle un hilo a cada core del MP, pero sin embargo tengo dos warp schedulers en un MP, para que tengo dos si solo trabajo con un warp?


Entonces, dada la arquitectura fermi, si yo pongo a correr un programa con suficientes grids, blocks, etc y pauso la ejecución...

Dentro de un MP:

Con cuantos warps esta trabajando de forma concurrente? y dentro de un warp, cuantos cores se estan encargando de su ejecucion?


La unica forma que todo tenga sentido para mi es que un MP tenga capacidad de manejar dos warps al mismo tiempo ( eso justificaría los dos warp schedulers) y a su vez cada core trabaje con dos hilos (tengo 16 cores para 32 hilos del warp)


Por ultimo,

Como se relaciona todo con los conflictos de bancos en memoria compartida? Si los conflictos de bancos ocurren a nivel de half warp (16 hilos) está relacionado con que hallan 16 cores en un bloque de  MP?

Por qué la divergencia se da a nivel de warp y no a nivel de half warp? Es un tema de como decidieron agrupar los hilos para una misma instrucción?


Imagen 1


Imagen 2



En respuesta a Gaston Daniel Barreto Sugliani

Re: Dudas cuda, SP, MP y warps

de Santiago Castro - InCo -

Ojo que el número de SMs depende de la tarjeta de Fermi. La 480 tiene 15, pero por lo que veo en la Wikipedia, por ejemplo, otras Fermi tienen menos: https://en.wikipedia.org/wiki/GeForce_400_series

Un bloque va a un solo SM, y un SM puede tener varios bloques alocados. Luego, al momento de ejecutar, el scheduler de una SM elige un warp (o half-warp?) de los bloques que tiene disponibles y lo ejecuta.

Un SM de Fermi de manera paralela trabaja con 32 hilos. De manera "concurrente" en realidad tiene más, porque los va cambiando entre los warp que tiene disponibles.

Creo que tiene dos warp schedulers porque en realidad trabaja a nivel de half-warp y no de warp, pero no estoy seguro de esto.

Los conflictos de banco de acceso a memoria compartida se dan a nivel de warp (o half-warp), pero es independiente a la cantidad de hilos del bloque. Es entre los hilos que se ejecuten en paralelo, en otras palabras.

La pregunta sobre la divergencia está relacionada con la duda que tengo que mencioné más arriba, de si en realidad trabaja a nivel de half-warp o de warp. Estaría bueno si alguien lo puede aclarar.

En respuesta a Gaston Daniel Barreto Sugliani

Re: Dudas cuda, SP, MP y warps

de Nicolas Rostan Talasimov -

Dejo este enlace porque capaz le sirve a alguien más para entender esto mejor, explican todos los detalles de la arquitectura Fermi, y está bien claro lo de los Scheduler en la pág 10. 

En respuesta a Nicolas Rostan Talasimov

Re: Dudas cuda, SP, MP y warps

de Martin Pedemonte -


Hola, disculpen pero por un error cuando cree el foro no quedé suscrito. Así que recién estoy viendo las preguntas por un mail que me mandó un estudiante del curso. Contesto las cosas que creo que quedaron pendiente (algunas ya fueron respondidas por Santiago Castro).

Para empezar quiero hacer una aclaración, es importante separar el modelo de ejecución de lo que realmente pasa en el hardware al momento de la ejeución. El fabricante explica el modelo de ejecución para que el código que se hace funcione siguiendo esas pautas, después hay cosas que en la práctica pueden funcionar un poco distintas a como nos las imaginamos por el modelo de ejecución.

1) Cada core ejecuta un hilo. No puede haber dos hilos ejecutando a la misma vez en un core.

2) Con respecto a "Como se relaciona todo con los conflictos de bancos en memoria compartida? Si los conflictos de bancos ocurren a nivel de half warp (16 hilos) está relacionado con que hallan 16 cores en un bloque de  MP?":

No está dicho expresamente y no creo que esté vinculado pero estamos "deduciendo". Creo que estos hechos no se vincular porque en las primeras arquitecturas CUDA (como la G80) había 8 cores por MP y el conflicto de banco ya era a nivel de half-warp, así que para mi no tienen ninguna vinculación ambos hechos. 

3) Por qué la divergencia se da a nivel de warp y no a nivel de half warp? Es un tema de como decidieron agrupar los hilos para una misma instrucción?

Básicamente porque el modelo lo establece así. Entiendo que te desorienta que habiendo 16 cores, por qué trabajar con 32 hilos en el warp y no hacer los warps de 16 hilos. El warp no ejecuta en un ciclo de reloj sólo, en ese caso está necesitando dos ciclos de reloj para poder ejecutar. Si volvés a mirar la arquitectura G80, tenía 8 cores por MP y también planificaba en base a warps de 32 hilos (necesitaba 4 ciclos de reloj para que los 32 hilos del warp pudieran completar la ejecución). ¿Cuál es el motivo? Es difícil saber, yo intuyo que tiene que ver con los accesos a memoria global, que la planificación se haga en base a 32 y el MP parta más chico le da más juego cuando hay hilos que se trancan esperando datos, pero es solamente una intuición. La realidad es que se planifica en base a 32 y eso es lo que tenemos que considerar al momento de programar. Si parte de otra forma, al no formar parte del modelo de programación, es un riesgo explotar esa característica, porque podría no estar soportada en otra arquitectura o en otra tarjeta.

Espero que haya quedado claro.

Saludos,

Martín