Test CUDA
![]() |
![]() |
![]() |
Título del Test:![]() Test CUDA Descripción: Examen CUDA |




Comentarios |
---|
NO HAY REGISTROS |
¿Qué paradigma de paralelismo utiliza CUDA?. MIMD (Multiple Instruction Multiple Data). SISD (Single Instruction Single Data). MISD (Multiple Instruction Single Data). SIMD (Single Instruction Multiple Data). ¿Qué tipo de sincronización imponen los wraps en que se descompone la ejecución de una instrucción CUDA?. Tanto intra-wrap como inter-wrap. Inter-wrap, pero no intra-wrap. Ni inter-wrap ni intra-wrap. Intra-wrap (esto es, para los hilos que componen los wraps), pero no inter-wrap (esto es, entre los wraps de la instrucción). ¿Qué concepto de CUDA aprovecha el paralelismo vectorial?. Los wraps de un bloque. Los bloques de una malla (grid). Los hilos de un wrap. Las mallas de un kernel. Tenemos un programa C con un millón de iteraciones con 5 instrucciones cada una. Las iteraciones son todas independientes, mientras que las instrucciones tienen todas dependencias de datos con su predecesora en el bucle. ¿Cómo paralelizarías el programa lanzando un solo kernel CUDA?. Utilizando un término medio como 5000 hilos de 1000 instrucciones cada uno. Utilizando un millón de hilos de 5 instrucciones. Utilizando un término medio como 1000 hilos de 5000 instrucciones cada uno. Utilizando 5 hilos de un millón de instrucciones. Disponemos de una GPU GeForce GTX 1080 de la generación Pascal (CCC 6.0) dotada con 40 multiprocesadores con memoria compartida de 64 Kbytes. Lanzamos mikernel<<<4000,64>>> con una única declaración __shared__ float a[256];. Asumiendo que cada hilo consume muy pocos registros y que por lo tanto no es este un factor que limite el paralelismo, ¿Cuántos bloques activos puede desplegar CUDA sobre dicha GPU?. 32 x 100 = 3200. 32 x 40 = 1280. 64 x 100 = 6400. 64 x 40 = 2560. Disponemos de una GPU GeForce GTX 1080 de la generación Pascal (CCC 6.0) dotada con 40 multiprocesadores con memoria compartida de 64 Kbytes. Lanzamos mikernel<<<4000,64>>> con una única declaración __shared__ float a[256];. Asumiendo que cada hilo consume muy pocos registros y que por lo tanto no es este un factor que limite el paralelismo, ¿cómo influye el tamaño de bloque (en este caso, 64) en el número de bloques activos?. Ninguna de las respuestas anteriores es correcta. Si aumentamos el tamaño de bloque, se reduce proporcionalmente el número de bloques activos. Si reducimos el tamaño de bloque, aumentamos proporcionalmente el número de bloques activos. Tanto si reducimos como si aumentamos el tamaño de bloque, aumentaremos o reduciremos, respectivamente, el número de bloques activos de forma proporcional. Disponemos de una GPU de la generación Fermi (CCC 2.0) dotada de 15 multiprocesadores, cada uno con 32768 (32K) registros disponibles. sin utilizar memoria compartida, lanzamos tukernel<<<15000,1024>>> y el compilador nos informa que cada hilo consume 16 registros. ¿Cuántos bloques activos puede desplegar CUDA sobre dicha GPU?. 15. 8 x 15 = 120 bloques, que por otra parte, es el máximo que admite dicha arquitectura. 2 x 15 = 30. 4 x 15 = 60. Disponemos de una GPU de la generación Fermi (CCC 2.0) dotada de 15 multiprocesadores, cada uno con 32768 (32K) registros disponibles. sin utilizar memoria compartida, lanzamos tukernel<<<15000,1024>>> y el compilador nos informa que cada hilo consume 16 registros. ¿Cómo influye el número de bloques declarados (1500 en este caso) en el número de bloques activos?. A menos bloques declarados, menos bloques activos. De ninguna manera. A más bloques declarados, más bloques activos. A más/menos bloques declarados, más/menos bloques activos. ¿Qué dos sistemas de almacenamiento difieren más en el tiempo de acceso desde la GPU?. Todas las comparativas de las otras tres opciones presentan una diferencia similar en el tiempo de acceso. La memoria compartida y el banco de registros de cada multiprocesador de la GPU. La memoria de vídeo de la GPU y el disco duro. La memoria de vídeo de la GPU y la memoria principal de la GPU. Un bloque de hilos CUDA: Ejecuta una parte de los hilos en el procesador principal y otra en los cores de la GPU. Puede asignarse a cualquier multiprocesador de la GPU para su ejecución. Las tres respuestas anteriores son correctas. Reparte los hilos entre los distintos multiprocesadores disponibles en la GPU. ¿Podemos comunicar los bloques de un mismo kernel durante su ejecución?. Sí, a través de un banco de registros. Sí, a través de una memoria global. No, ya que los bloques pueden ejecutarse en cualquier orden y de forma independiente. Sí, a través de la memoria compartida. ¿Qué valor es superior en CUDA, el máximo número de bloques activos que pueden coexistir en un multiprocesador o el máximo número de hilos por bloque?. Depende de la generación de GPU. El número de hilos por bloque. Ambos son iguales. El número de bloques activos. El wrap se sitúa entre: Los hilos y los bloques (es decir, el wrap se compone de hilos y el bloque se compone de wraps). Los bloques y las mallas. Los hilos y las mallas. Los hilos y los multiprocesadores. Para un kernel dado, el número de bloques activos que pueden alojarse en cada multiprocesador de la GPU depende de: El número de registros requerido por el kernel y la memoria compartida consumida por el kernel. Ninguna de las otras respuestas es correcta. La memoria compartida consumida por el kernel. El número de registros requerido por el kernel. Valores intrínsecos a tener en cuenta a la hora de paralelizar un programa CUDA de forma genérica (esto es, que pueda adaptarse a generaciones futuras sin necesidad de recompilar) son: blockIdx, blockDim y threadIdx. blockIdx y threadIdx. dim2 y dim3. dimBlock y dimGrid. Frente a los hilos de la CPU (tomando como referencia, por ejemplo, POSIX Threads y C), los hilos de la GPU en CUDA: Apenas gastan tiempo de conmutación (cambio de contexto). No referencian al banco de registros. No pueden aprovechar la caché de datos. Proceden siempre de un único padre y se ejecutan todos concurrentemente. Queremos ejecutar un kernel CUDA compuesto de 2^30 hilos (1 Giga-hilos). ¿Qué malla de hilos (grid) elegirías?. 2^30 bloques de un hilo. 2^10 bloques de 2^20 hilos. Un bloque de 2^30 hilos. 2^20 bloques de 2^10 hilos. Si lanzamos un kernel que tiene un solo bloque de hilos CUDA: Solo utilizaremos un core de uno de los multiprocesadores de la GPU. Solo aprovecharemos un core de cada uno de los multiprocesadores. Solo aprovecharemos uno de los multiprocesadores. Podremos aprovechar todos los cores y todos los multiprocesadores. Lanzamos un kernel CUDA que solo tiene sentencias synchthreads() y donde los bloques de hilos constan de 4 wraps. En estas condiciones, se cumple que: Los wraps no tienen por qué comenzar su ejecución en el orden 0, 1, 2, 3, pero sí finalizar en ese orden. Los wraps comienzan su ejecución en el el orden 0, 1, 2, 3, pero no tienen por qué finalizar en ese orden. Los wraps comienzan su ejecución en el orden 0, 1, 2, 3, y finalizan también en ese orden. No puede predecirse nada acerca del orden de ejecución de los wraps. ¿Qué tipo de código C resulta más desfavorable para su ejecución en GPU y puede ser incluso más rápido en CPU?. Uno de tipo compute-bound, es decir, con mucha intensidad aritmética en el que abundan los cálculos matemáticos. Ninguno de los casos aquí mencionados pueden ser más rápidos en la CPU que en la GPU. Uno del tipo memory-bound, es decir, intensivo en el acceso a memoria. Uno con muchas sentencias condicionales (IF). El hecho de que los wraps de una instrucción CUDA no sean necesariamente síncronos conlleva renombrar un paradigma de paralelismo tradicionalmente menos flexible, pasando a denominarse: MIMO (Multiple Instruction Multiple Data) en lugar de SIMD (Single Instruction Multiple Data). SIMD (Single Instruction Multiple Data) en lugar de SIMT (Single Instruction Multiple Thread). SIMT (Single Instruction Multiple Thead) en lugar de SIMD (Single Instruction Multiple Data). MIMD (Multiple Instruction Multiple Data) en lugar de SIMT (Single Intruction Multiple Thread). ¿Qué tipo de paralelismo emplean los wraps?. Vectorial. Masivo. Intrusivo. En tiempo de compilación. A partir de la generación Kepler, el máximo número de hilos que puede tener un programa CUDA es de unos pocos: Exas (2^60 hilos). Gigas (2^630 hilos). Petas (2^50 hilos). Teras (2^40 hilos). |