Encabezado Facultad de Ciencias
Presentación

Ciencias de la Computación (plan 1994) 2015-1

Optativas, Seminario de Aplicaciones de Cómputo II

Grupo 7115, 20 lugares. 4 alumnos.
Programación de GPU's con CUDA. (Seminario de Computación A, Plan 2013)
Laboratorio lunes de 14 a 16 - CC3
Profesor José David Flores Peñaloza ma ju 17 a 18:30 P108
Ayudante Ángel Renato Zamudio Malagón lu mi 16 a 17 P108
Ayud. Lab. Manuel Alcántara Juárez lu 14 a 16 Laboratorio de Ciencias de la Computación 3
 

Seminario de Aplicaciones de Cómputo II

(programación con CUDA).

1.- Presentación.

Hasta alrededor del 2003, los fabricantes pudieron incrementar la velocidad de sus procesadores de manera exponencial. En consecuencia, los desarrolladores de software pudieron dar por hecho que, sin ningún esfuerzo, sus programas correrían más rápido en las nuevas generaciones de procesadores.

Desafortunadamente la tasa de aumento de velocidad de los procesadores no se ha podido mantener en los últimos 10 años, debido principalmente al enorme consumo de energía de un procesador más veloz, y a los problemas de disipación de calor que este consumo acarrea. En lugar de hacer procesadores más rápidos, la industria se ha enfocado en fabricar procesadores con la misma velocidad pero con cada vez más núcleos de procesamiento.

El ¨aventón grátis¨ se terminó. Ahora, para que nuestros programas exploten al máximo las capacidades de nuestro hardware, debemos diseñar nuestros algoritmos y escribir nuestros programas explícitamente paralelos. CUDA, la infraestructura que aprenderemos a usar en este curso, es muy buena para comenzar a trabajar con programas paralelos, debido a su relación directa con lenguajes tradicionales de programación, como el C y el C++.

La industria de los procesadores gráficos de las tarjetas de video (GPU's), ha seguido un camino similar al de la industria de los CPU's, haciendo sus GPU's más poderosos mediante la adición de más núcleos con casi la misma velocidad, en lugar de dotarlos de pocos núcleos mucho más rápidos. Algo muy interesante, es que debido a las necesidades intrínsecas de la graficación por computadora (núcleos mucho más simples que los de los CPU's, con sistemas de memoria también más simples), ha sido posible que aún en tarjetas gráficas "baratas", podamos contar actualmente con cientos e incluso miles de núcleos "núcleos". Esto le brinda a las GPU's una capacidad de cómputo en bruto mucho mayor que la que tienen los CPU's, los cuales tienen actualmente a lo más media docena de núcleos.

CUDA es una plataforma de cómputo GPGPU (cómputo de propósito general en GPU's) que permite, utilizando el lenguaje de programación C con algunas extensiones, utilizar el potencial de cómputo de los GPU's para resolver tareas de propósito general, que pueden incluso no tener ninguna relación con la graficación por computadora.

En este curso se estudiará el modelo de cómputo ofrecido por la plataforma CUDA, y también el uso del lenguaje CUDA C para programar esta plataforma.

El curso tendrá un enfoque práctico, basado en la explicación de conceptos por parte del profesor y el ayudante, y la implementación de varios proyectos de programación por parte del alumno.

2.- Temario

1.-Introducción

Historia. Paralelismo y sincronización. Generaciones de CUDA y capacidades de los dispositivos. Tendencias en CUDA.

2.- Plataforma CUDA

Modelo de programación. Hilos, Bloques, Kernels. Multiprocesadores y calendarización de bloques. Diferencias entre GPU's de una misma generación. Escalabilidad de programas CUDA.

3.- CUDA C

Programación de kernels. Ejecución de kernels. Variables predefinidas para identificación de hilos. Copiado de memoria. Sincronización CPU-GPU. Notas sobre nvcc.

4.- Jerarquía de memoria de CUDA

Memoria global. Memoria compartida. Memoria constante. Registros. Caches. Latencia de los diferentes niveles. Memoria de textura. Tendencias en la evolución de la jerarquía de memoria.

5.- Sincronización

Condiciones de carrera. Deadlocks. Sincronización local con barreras. Operaciones atómicas. Streams y sincronización global con multiples lanzamientos de kernels.

6.- Optimización y mejores prácticas.

Warps. Calendarización de warps vs calendarización de bloques. Divergencia de warps. Uso eficiente del sistema de memoria.

7.- Herramientas de depuración, perfilado y graficación.

cuda-gdb. nsigth. printf. Interacción con OpenGl.

8.- Discusión de proyectos finales.

3.- Bibliografía

CUDA by Example: An Introduction to General-Purpose GPU Programming. Jason Sanders, Edward Kandrot. Adisson Wesley, 2010.

Programming Massively Parallel Processors, Second Edition: A Hands-on Approach. David Kirk, Wen-mei Hwu. Morgan Kaufmann, 2012.

CUDA Programming: A Developer's Guide to Parallel Computing with GPUs. Shane Cook. Morgan Kaufmann, 2012.

 


Hecho en México, todos los derechos reservados 2011-2016. Esta página puede ser reproducida con fines no lucrativos, siempre y cuando no se mutile, se cite la fuente completa y su dirección electrónica. De otra forma requiere permiso previo por escrito de la Institución.
Sitio web administrado por la Coordinación de los Servicios de Cómputo de la Facultad de Ciencias. ¿Dudas?, ¿comentarios?. Escribenos. Aviso de privacidad.