He estado usando CUDA para un par de semanas, pero tengo algunas dudas acerca de la asignación de bloques/deformación/hilo.
Estoy estudiando la arquitectura de una didáctica punto de vista (proyecto de la universidad), por lo que alcanzar el máximo rendimiento no es mi preocupación.

Primero de todo, me gustaría entender si me dieron estos hechos:

  1. El programador escribe un núcleo, y organizar su ejecución en una cuadrícula de hilo de bloques.

  2. Cada bloque se asigna a un Streaming Multiprocessor (SM). Una vez asignado no puede migrar a otro SM.

  3. Cada SM divide sus propios bloques en la Deformación (en la actualidad con un tamaño máximo de 32 hilos). Todos los hilos en la urdimbre se ejecuta de forma simultánea en los recursos de la SM.

  4. La ejecución de un hilo que se realiza por los Núcleos CUDA contenida en el SM. No hay ninguna asignación específica entre los hilos y los núcleos.

  5. Si una urdimbre contiene 20 hilo, pero en la actualidad sólo hay 16 núcleos disponibles, la trama no se ejecutará.

  6. Por otro lado, si un bloque contiene 48 hilos, será dividida en 2 urdimbres y que se ejecutan en paralelo siempre que hay suficiente memoria disponible.

  7. Si un subproceso se inicia en un núcleo, entonces es detenido por el acceso a la memoria o para una larga de punto flotante de operación, su ejecución podría reanudar en otro núcleo.

Son correctas?

Ahora, tengo una GeForce 560 Ti así que de acuerdo a las especificaciones está equipado con 8 cm, conteniendo cada uno de 48 núcleos CUDA (384 núcleos en total).

Mi objetivo es asegurarse de que cada núcleo de la arquitectura ejecuta las instrucciones de los MISMOS. Suponiendo que mi código no se requieren más registro de las disponibles en cada SM, me imaginaba enfoques diferentes:

  1. Puedo crear 8 bloques de 48 hilos cada uno, de modo que cada SM tiene 1 bloque a ejecutar. En este caso el 48 hilos que se ejecutan en paralelo en el SM (explotación de todos los 48 núcleos disponibles para ellos)?

  2. ¿Hay alguna diferencia si el lanzamiento de 64 bloques de 6 hilos? (Suponiendo que se asignan de manera equitativa entre el SMs)

  3. Si me «sumergir» la GPU en el trabajo programado (creación de 1024 bloques de 1024 hilo de cada uno, por ejemplo), ¿es razonable asumir que todos los núcleos será utilizada en un momento determinado, y se realizan los mismos cálculos (suponiendo que los hilos nunca puesto)?

  4. Hay alguna forma de comprobar estas situaciones utilizando el analizador?

  5. Hay ninguna referencia para estas cosas? He leído la guía de Programación de CUDA y los capítulos dedicados a la arquitectura de hardware en «Programación de Procesadores Masivamente Paralelos» y «CUDA diseño de la Aplicación y el desarrollo»; pero yo no podía obtener una respuesta precisa.

  • Me gustaría anexar como un comentario de lo que es «CUDA core». «CUDA core» o «unidad de Ejecución» es totalmente canalizado entero ALU y FPU que ejecuta uno de instrucciones aritméticas la instrucción por ciclo de reloj en una cuda hilo.
InformationsquelleAutor Daedalus | 2012-05-05

2 Comentarios

  1. 111

    Dos de las mejores referencias son

    1. NVIDIA Fermi Arquitectura computacional Whitepaper
    2. GF104 Comentarios

    Voy a tratar de responder a cada una de sus preguntas.

    El programador se divide el trabajo en hilos, los hilos en el hilo de los bloques, y el hilo de bloques en las redes. El trabajo de cálculo distribuidor asigna hilo de bloques para el Streaming de Multiprocesadores (SMs). Una vez que un hilo de bloque se distribuye a un SM de los recursos para el hilo bloque asignado (urdimbres y memoria compartida) y los hilos se dividen en grupos de 32 hilos llamado la deformación. Una vez que una urdimbre es asignado se denomina activo de la urdimbre. Los dos urdimbre de los programadores de elegir dos urdimbres por ciclo y para el despacho de las deformaciones a las unidades de ejecución. Para más detalles sobre las unidades de ejecución y la instrucción de despacho de ver Uno p.7-10 y Dos.

    4′. Hay una correlación entre laneid (hilos de índice en una urdimbre) y un núcleo.

    5′. Si una urdimbre contiene menos de 32 hilos en la mayoría de los casos se ejecute en el mismo como si tiene 32 hilos. La deformación puede tener menos de 32 hilos activos por varias razones: el número de hilos por bloque no es divisible por 32, el programa ejecuta un divergentes bloque de hilos que no tome la ruta de acceso actual se marca como inactivo, o un hilo de la urdimbre de salir.

    6′. Un hilo bloque se divide en
    WarpsPerBlock = (ThreadsPerBlock + WarpSize – 1) /WarpSize
    No hay ningún requisito para la urdimbre de los programadores de seleccionar dos urdimbres del mismo hilo bloque.

    7′. Una unidad de ejecución no se bloqueará en una operación de la memoria. Si el recurso no está disponible cuando la instrucción está listo para ser enviado a la instrucción será enviado de nuevo en el futuro, cuando el recurso está disponible. La deformación puede detener en las barreras, en las operaciones de la memoria, la textura de las operaciones, las dependencias de datos, … estancamiento de la deformación no es elegible para ser seleccionado por la urdimbre de programador. En Fermi es útil tener al menos 2 elegibles deformaciones por ciclo, de modo que la deformación programador puede emitir una instrucción.

    Ver referencia Dos de las diferencias entre una GTX480 y GTX560.

    Si usted lee el material de referencia (pocos minutos) creo que usted encontrará que su objetivo no tiene sentido. Voy a tratar de responder a sus puntos.

    1′. Si el lanzamiento de kernel<<<8, 48>>> obtendrá 8 bloques, cada uno con 2 urdimbres de 32 y 16 hilos. No hay ninguna garantía de que estos 8 bloques serán asignados a los distintos SMs. Si 2 bloques son asignados a un SM, entonces es posible que cada uno de deformación programador puede seleccionar una urdimbre y ejecutar la urdimbre. Se debe usar sólo 32 de los 48 núcleos.

    2′. Hay una gran diferencia entre las 8 bloques de 48 hilos y 64 bloques de 6 hilos. Supongamos que su kernel no tiene ninguna divergencia y cada subproceso se ejecuta 10 instrucciones.

    • 8 bloques con 48 hilos = 16 deformaciones * 10 instrucciones = 160 instrucciones
    • 64 bloques con 6 hilos = 64 deformaciones * 10 instrucciones = 640 instrucciones

    Con el fin de obtener una eficiencia óptima, la división del trabajo debe ser en múltiplos de 32 hilos. El hardware no se unan con hilos de diferentes deformaciones.

    3′. Una GTX560 puede tener 8 cm * 8 bloques = 64 bloques en un momento u 8 cm * 48 urdimbres = 512 urdimbres si el núcleo no max registros o memoria compartida. En cualquier momento dado en una parte de la obra estará activo en los SMs. Cada SM tiene varias unidades de ejecución (más de núcleos CUDA). Que los recursos están en uso en un momento dado depende de la deformación de los programadores y la instrucción de la mezcla de la aplicación. Si usted no hace TEX operaciones, a continuación, el TEX unidades va a estar inactivo. Si no haces un especial de punto flotante de operación de la SUFU unidades de inactividad.

    4′. Parallel Nsight y el Visual Profiler mostrar

    una. ejecutadas IPC

    b. emitido IPC

    c. activa la deformación por ciclo activo

    d. elegible deformaciones por ciclo activo (Nsight sólo)

    e. urdimbre puesto de razones (Nsight sólo)

    f. hilos activos de acuerdo a las instrucciones ejecutadas

    El analizador no muestran el porcentaje de utilización de cualquiera de las unidades de ejecución. Para GTX560 una estimación aproximada sería IssuedIPC /MaxIPC.
    Para MaxIPC asumir
    GF100 (GTX480) es de 2
    GF10x (GTX560) es de 4 pero el destino es 3 es un destino mejor.

    • Gracias por tu respuesta. He leído las referencias, pero hay un par de cosas que no entiendo en tu respuesta. En las siguientes preguntas, estoy asumiendo que estamos utilizando una arquitectura Fermi con 48 núcleos (16 núcleos * 3 «grupos de base»): 1. Usted ha mencionado un mapeo entre los núcleos y laneid. ¿Qué tipo de asignación es? 2. A partir de las referencias que tengo de que cada «grupo central» ejecutar en más de una mitad de la urdimbre (16 hilos) por ciclo de reloj. Así que en teoría si tenemos 48 hilos en el mismo bloque, que será organizado en 3 medio-deformación y ejecutar en paralelo en los 48 núcleos. Estoy en lo cierto?
    • Núcleos CUDA son los números de precisión simple FP unidades. El pensamiento de la ejecución en términos de núcleos CUDA no es correcto. Cada warp tiene 32 hilos. Estos hilos se emitirá un grupo de unidades de ejecución (por ejemplo, 16 núcleos cuda). Con el fin de emitir a los 48 núcleos en un único reloj de uno de los dos urdimbre de los programadores de necesidades para seleccionar una urdimbre que cumpla con la petición de un superscalar par y por tanto de las instrucciones deben ser de un tipo ejecutado por núcleos CUDA. Además el otro urdimbre programador tiene que elegir una urdimbre cuya siguiente instrucción que será ejecutada por núcleos CUDA.
    • No hay ningún requisito de que las deformaciones en el mismo bloque o en que las deformaciones en un bloque tienen el mismo contador de programa.
    • Vamos a la razón en un único SM alcance. Puedo crear un bloque de 48 hilos. Cada subproceso se ejecuta sólo un entero de 32 bits, además de entre dos registros. Hay tres medio-deformación. El primer programador escoge a los dos de ellos y los envía al núcleo del grupo #1 y #2. El segundo programador recoge el resto de la mitad-de la urdimbre y la envía al núcleo del grupo #3. Los tres medio-urdimbres de ejecutar la suma en paralelo. Es ese derecho?
    • En el ejemplo de cada programador es escoger una de la urdimbre y de la emisión de la 1 de la instrucción. En este caso sólo 2 grupos de unidades de ejecución será utilizado. Con el fin de utilizar más unidades de ejecución 1 de los programadores tiene doble problema. Como se indica en las referencias hay varios tipos de unidades de ejecución (no sólo lo que se acuñó núcleos cuda) y hay instrucciones de emparejamiento reglas (no documentado) que deben cumplirse para que los programadores para que se doble problema.
    • estoy buscando por toda la web para encontrar donde esta 8 bloques activos por SM en la arquitectura Fermi viene. No es siquiera mencionado en el fermi documento. ¿Tienes alguna referencia al respecto?
    • Ver la Guía de Programación de CUDA (docs.nvidia.com/cuda/cuda-c-programming-guide/…) de la Sección G. Calcular las Capacidades de la Tabla 13. Especificaciones técnicas por la Capacidad de cálculo de la fila «número Máximo de residentes bloques por multiprocesador».

  2. 8

    «E. Si una urdimbre contiene 20 hilos, pero en la actualidad sólo hay 16 núcleos disponibles, la trama no se ejecutará.»

    es incorrecta. Usted está confuso núcleos en su sentido habitual (también se utiliza en la Cpu) – el número de «multiprocesadores» en una GPU, con núcleos de nVIDIA de marketing de hablar («nuestra tarjeta tiene miles de núcleos CUDA»).

    Una urdimbre misma solo puede ser programado en un solo núcleo (= multiprocesador), y se puede ejecutar hasta 32 hilos al mismo tiempo; no se puede utilizar más de un solo núcleo.

    El número «48 urdimbres» es el número máximo de los activos de la deformación (deformación que puede ser elegido para ser programados para el trabajo en el siguiente ciclo, en cualquier ciclo) por multiprocesador, en las Gpu nVIDIA con Capacidad de cálculo 2.x; y este número corresponde a 1536 = 48 x 32 hilos.

    Respuesta basada en la este webinar

    • Editado la respuesta a la dirección de esta. Es bueno que tuviste paciencia con ella, pero ya han pasado cinco años…
    • de un solo núcleo (= multiprocesador) ? Creo que la pregunta asume la terminología de un solo núcleo = procesador y no multiprocesador. Con su terminología su respuesta es correcta.

Dejar respuesta

Please enter your comment!
Please enter your name here