Sé que hay multiprocesadores en un CUDA GPU que contienen núcleos CUDA en ellos. En mi lugar de trabajo en el que estoy trabajando con una GTX 590, que contiene 512 núcleos CUDA, 16 de multiprocesadores y que tiene una urdimbre tamaño 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 el tamaño de bloque es de 1024.

Mi pregunta es cómo el tamaño de bloque y el multiprocesador conde – deformación tamaño son exactamente. Permítanme decir a mi comprensión de la situación: Por ejemplo yo asigne N bloques con el máximo threadPerBlock tamaño de 1024 en la GTX 590. Tal y como yo lo entiendo de la guía de programación de CUDA y de otras fuentes, los bloques son, en primer lugar, enumerados por el hardware. En este caso, 16 de los N bloques asignados a los diferentes multiprocesadores. Cada bloque contiene 1024 hilos y el hardware del programador asigna 32 de estos hilos a los 32 núcleos en un único multiprocesador. Los hilos en la misma multiprocesador (urdimbre) proceso de la misma línea del código y el uso de la memoria compartida de la actual multiproccessor. Si la corriente de 32 hilos encuentro un off-chip de la operación como de la memoria de lectura-escribe, se sustituye con otro grupo de 32 hilos del bloque actual. Así que, en realidad, hay 32 hilos en un solo bloque que se exactamente que se ejecutan en paralelo en un multiprocesador que en cualquier momento dado, no todo el 1024. Por último, si un bloque es completamente procesados por un multiprocesador, un nuevo hilo bloque de la lista de los N hilo de bloques está enchufado a la corriente de multiprocesador. Y por último hay un total de 512 hilos que se ejecutan en paralelo en la GPU durante la ejecución del kernel CUDA. (Yo sé que si un bloque se utiliza más registros de los que en un único multiprocesador, a continuación, se divide a trabajar en dos multiprocesadores pero supongamos que cada bloque puede encajar en un solo multiprocesador en nuestro caso).

Así, es mi modelo de la CUDA de ejecución en paralelo es la correcta? Si no, lo que está mal o que falta? Quiero afinar el proyecto en el que estoy trabajando, así que tengo la más correcta modelo de trabajo de la totalidad de la cosa.

1 Comentario

  1. 18

    En mi lugar de trabajo en el que estoy trabajando con una GTX 590, que contiene 512 núcleos CUDA, 16 de multiprocesadores y que tiene una urdimbre tamaño 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 el tamaño de bloque es de 1024.

    Una GTX590 contiene 2x los números que usted ha mencionado, ya que hay 2 Gpu de la tarjeta. A continuación, me voy a centrar en un único chip.

    Permítanme decir a mi comprensión de la situación: Por ejemplo yo asigne N bloques con el máximo threadPerBlock tamaño de 1024 en la GTX 590. Tal y como yo lo entiendo de la guía de programación de CUDA y de otras fuentes, los bloques son, en primer lugar, enumerados por el hardware. En este caso, 16 de los N bloques asignados a los diferentes multiprocesadores.

    Bloque no necesariamente se distribuyen uniformemente a través de los multiprocesadores (SMs). Si usted programar exactamente 16 bloques, algunos de los SMs puede conseguir 2 o 3 bloques, mientras que unos pocos de ellos van inactivo. No sé por qué.

    Cada bloque contiene 1024 hilos y el hardware del programador asigna 32 de estos hilos a los 32 núcleos en un único multiprocesador.

    La relación entre los hilos y los núcleos no es directa. Hay 32 «basic» Alu en cada uno de los SM. Los que manejar las cosas tales como único punto flotante de precisión y la mayoría de los 32 bits enteros y las instrucciones de la lógica. Pero sólo hay 16 load/store unidades, así que si la deformación de la instrucción que se está procesando actualmente es un load/store, debe programarse dos veces. Y sólo hay 4 funciones especiales de las unidades, que hacer cosas tales como la trigonometría. Por lo que estas instrucciones deben ser programadas 32 /4 = 8 veces.

    Los hilos en la misma multiprocesador (urdimbre) proceso de la misma línea del código y el uso de la memoria compartida de la actual multiproccessor.

    No, puede haber muchos más de 32 hilos «en vuelo» al mismo tiempo en una sola SM.

    Si el actual 32 hilos encuentro un off-chip de la operación como de la memoria de lectura-escribe, se sustituye con otro grupo de 32 hilos del bloque actual. Así que, en realidad, hay 32 hilos en un solo bloque que se ejecuta exactamente en paralelo en un multiprocesador que en cualquier momento dado, no todo el 1024.

    No, no es sólo la memoria de las operaciones que causan deformaciones que ser reemplazado. La Alu son también profundamente segmentado, por lo que los nuevos deformaciones serán intercambiados en las dependencias de datos se producen para los valores que están todavía en marcha. Por lo tanto, si el código contiene dos instrucciones donde el segundo utiliza la salida de la primera, la trama va a ser puesto en espera mientras el valor de la primera instrucción que hace su camino a través de la tubería.

    Finalmente, si un bloque es completamente procesados por un multiprocesador, un nuevo hilo bloque de la lista de los N hilo de bloques está enchufado a la corriente de multiprocesador.

    Un multiprocesador puede procesar más de un bloque en un tiempo, pero un bloque no se puede mover a otro MP una vez que el proceso se ha iniciado. El número de hilos en un bloque que actualmente están en vuelo depende de la cantidad de recursos que el bloque se utiliza. El CUDA de Ocupación de la Calculadora le dirá la cantidad de bloques que serán en vuelo al mismo tiempo, basados en el uso de recursos de su núcleo específico.

    Y, finalmente, hay un total de 512 hilos que se ejecutan en paralelo en la GPU durante la ejecución del kernel CUDA. (Yo sé que si un bloque se utiliza más registros de los que en un único multiprocesador, a continuación, se divide a trabajar en dos multiprocesadores pero supongamos que cada bloque puede encajar en un solo multiprocesador en nuestro caso).

    No, un bloque no puede ser dividido el trabajo en dos multiprocesadores. Todo un bloque siempre es procesada por una sola multiprocesador. Si el multiprocesador no tiene recursos suficientes para procesar al menos un bloque con su kernel, usted recibirá un núcleo de lanzamiento de error y el programa no se ejecuta en absoluto.

    Depende de cómo se defina un hilo como «ejecutar». La GPU suele tener muchos más de 512 hilos de consumo de los diferentes recursos en el chip en el mismo tiempo.

    Ver @harrism la respuesta en esta pregunta: CUDA: ¿cuántas hebras concurrentes en total?

    • Gracias por la respuesta. Hizo algunas cosas más, claro, pero todavía hay áreas de confusión para mí. Tal y como yo lo entiendo de tu respuesta y @harrism la respuesta de un multiprocesador puede procesar más de un solo bloque en el mismo tiempo y no puede ser de hasta 48 deformaciones que residen en el multiprocesador. Mi pregunta es, si un multiprocesador puede subprocesos del proceso de los diferentes bloques, como puede dividir la memoria compartida entre los bloques? Quiero decir, la memoria compartida es de alrededor de 48 KB de tamaño y un bloque puede ser que ya utilizan más de ella.
    • La memoria compartida es uno de los posibles factores limitantes en la cantidad de bloques que se pueden ejecutar simultáneamente. Si un bloque se utiliza más de la mitad de la memoria compartida disponible, entonces sólo una cuadra puede ejecutar al mismo tiempo. Si un bloque de usos entre 1/2 y 1/3 de disponible de memoria compartida, 2 se pueden ejecutar simultáneamente, y así sucesivamente.
    • Hay muchos excelentes análisis de la arquitectura Fermi en línea. Beyond3D tiene al menos un par de simpáticos. Aquí está uno. Aunque me parece que el diseño de temas muy interesantes, no creo que es necesario saber el chip en cualquier lugar cerca de detalle para ser capaz de escribir óptimo de la GPU de software. Realmente, las cosas en el CUDA C Guía de Programación es todo lo que usted necesita.

Dejar respuesta

Please enter your comment!
Please enter your name here