ICNPG 2016 Aspectos Prácticos
• Aprendizaje de nuevas técnicas de programación para explotar el potencial de las GPUs (tarjetas gráficas) como dispositivos aceleradores de cálculo.
• CUDA C: que contiene extensiones específicas del lenguaje C para tarjetas gráficas compatibles con la arquitectura CUDA (Compute Unified Device Architecture) para propósitos de cálculo general.
• Bibliotecas y herramientas de alto nivel para poder explotar el poder de calculo de las GPUs.
• El curso es práctico, con problemas sencillos de cálculo numérico. • Estudiantes de postgrado de física, ingeniería y áreas relacionadas.
1. CUDA C Básico. Debugging y profiling. 2. Algoritmos básicos de paralelismo. 3. Thrust. 4. Introducción al uso de directivas: OpenACC, OpenMP. 5. Python y CUDA. 6. FFT. 7. Algebra Lineal en GPUs. 8. Jerarquía de memorias. Streams. 9. Optimización.
gpgpu-fisica.cabib.local (10.73.25.207) Tesla C2075,Tesla C2070 K20, GTX 780 (x5), GTX Titan GTX 480 CCAD - Bariloche , Gerencia de Física
sysadmin: Gustavo Berman
http://fisica.cab.cnea.gov.ar/gpgpu/ •
Las clases están on line
•
Los problemas están on line
•
Curso Hands-on:
•
Trabajo de programación en clase.
•
Guias de problemas ampliando el trabajo de clase.
Alejandro Kolton (Sólidos) Mónica Denham (UnRN) Karina Laneri (FiEstIn) Pablo Cappagli (Radioterapia) Flavio Colavecchia (Colisiones/Radioterapia)
[email protected]
todos los alumnos + profesores problemas, dudas, consultas sobre el curso en general
Usar el subject!
[email protected]
email dirigido sólo a los docentes problemas, dudas, consultas particulares
Usar el subject!
Evaluación •
Parcial: Envío de la solución de un problema seleccionado de las guías de trabajos prácticos:
•
Códigos fuente (correctness, performance, códigos co-men-ta-dos!)
•
Una informe con los resultados del problema propuesto
•
Fecha de entrega a determinar, a lo sumo 10 días antes del final, estricto!
•
Asistencia a todos los encuentros (se toma lista!!!)
•
Final: multiple choice + un ejercicio en computadora
biblio David B. Kirk, Wen-mei W. Hwu. Programming Massively Parallel Processors: A Hands-on Approach, Morgan Kaufmann, 2010. Jason Sanders, Edward Kandrot, CUDA by Example, Addison-Wesley, 2010. Robert Farber, CUDA Application Design and Development, Morgan Kaufman, 2011. Shane Cook, CUDA Programming, Morgan Kaufman, 2012.
NVIDIA Inc., CUDA C Programming Guide, version 7.5, 2015.
¿ Dudas ?
Acceso al cluster compute-0-0
ssh
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-2
PuTTy
compute-0-1
Acceso al cluster compute-0-0 gpgpu-fisica.cabib.local 10.73.25.207
login: fulano passwd: fulano.2016
compute-0-2
compute-0-1
14
Copiando los códigos [flavioc@gpgpu-fisica ~]$ ls /share/apps/codigos common ejemplos_thrust SUMA-Vectores Hola_mundo [flavioc@gpgpu-fisica ~]$ mkdir icnpg2015 [flavioc@gpgpu-fisica ~]$ cd icnpg2015/ [flavioc@gpgpu-fisica icnpg2015]$ cp -R /share/apps/codigos/Hola_mundo/ . [flavioc@gpgpu-fisica icnpg2015]$ ls Hola_mundo [flavioc@gpgpu-fisica icnpg2015]$ cd Hola_mundo [flavioc@gpgpu-fisica Hola_mundo]$ ls hola_mundo_io.c hola_mundo_io.h main_hola_mundo.c Makefile submit_cpu.sh
Hola Mundo #include #include #include #include "hola_mundo_io.h" #ifndef VECES #define VECES 10 #endif int main() { int i; for(i = 0; i < VECES; i++) { printf("%d: ",i); imprime_hola_mundo(); } return 0; }
main_hola_mundo.c
Hola Mundo #include #include #include #include "hola_mundo_io.h"
main_hola_mundo.c hola_mundo_io.h int imprime_hola_mundo();
#ifndef VECES #define VECES 10 #endif int main() { int i; for(i = 0; i < VECES; i++) { printf("%d: ",i); imprime_hola_mundo(); }
hola_mundo_io.c #include #include "hola_mundo_io.h"
int imprime_hola_mundo() return 0; }
Compilando y corriendo [flavioc@gpgpu-fisica Hola_mundo]$ gcc hola_mundo_io.c main_hola_mundo.c -o main [flavioc@gpgpu-fisica Hola_mundo]$ ./main 0: Hola Mundo! 1: Hola Mundo! 2: Hola Mundo! 3: Hola Mundo! 4: Hola Mundo! 5: Hola Mundo! 6: Hola Mundo! 7: Hola Mundo! 8: Hola Mundo! 9: Hola Mundo! [flavioc@gpgpu-fisica Hola_mundo]$
Compilando con Makefile # Compilador y flags del compilador y del linker CC=gcc CFLAGS= CPPFLAGS= LDFLAGS = # # Nombre del ejecutable # BIN=main # # Archivos fuentes # SOURCES=$(shell echo *.c) # # Objetos a partir de los fuentes # OBJECTS=$(patsubst %.c, %.o, $(SOURCES)) # # Rules # all: $(BIN) $(BIN): $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ %.o: %.c $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< .PHONY: all clean clean: rm -f .depend *.o $(BIN)
Makefile
Compilando y corriendo [flavioc@gpgpu-fisica Hola_mundo]$ make gcc -o hola_mundo_io.o -c hola_mundo_io.c gcc -o main_hola_mundo.o -c main_hola_mundo.c gcc -o main hola_mundo_io.o main_hola_mundo.o [flavioc@gpgpu-fisica Hola_mundo]$ ./main 0: Hola Mundo! 1: Hola Mundo! 2: Hola Mundo! 3: Hola Mundo! 4: Hola Mundo! 5: Hola Mundo! 6: Hola Mundo! 7: Hola Mundo! 8: Hola Mundo! 9: Hola Mundo! [flavioc@gpgpu-fisica Hola_mundo]$
Corriendo en las colas del cluster • Cada trabajo (job) tiene un nombre y un número, y necesitamos un script para enviar el código a correr
• submit.sh es el script para enviar el código a las colas de ejecución • qsub submit.sh Envía el código a la cola de ejecución y genera un número de trabajo xx y nombre
• qstat -f • qdel xx
Consulta la cola de ejecución Borrar el trabajo xx enviado
21
Las colas del cluster [flavioc@gpgpu-fisica Hola_mundo]$ qsub submit_cpu.sh Your job 148 ("HolaMundo") has been submitted [flavioc@gpgpu-fisica Hola_mundo]$ qstat -f queuename qtype resv/used/tot. load_avg arch states ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.16 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.00 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.00 linux-x64 . . . ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.16 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.00 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.00 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.08 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.00 linux-x64 ---------------------------------------------------------------------------------
[email protected] BIP 0/0/2 0.26 linux-x64 ############################################################################ - PENDING JOBS - PENDING JOBS - PENDING JOBS - PENDING JOBS - PENDING JOBS ############################################################################ 148 0.00000 HolaMundo flavioc qw 09/30/2013 20:57:13 1
Corriendo en el cluster #! /bin/bash # El path de ejecucion del job es el directorio actual #$ -cwd # Reune stdout y stderr en .oxx #$ -j y # Bourne shell para el job #$ -S /bin/bash # Nombre del job #$ -N HolaMundo # pido la cola cpu.q #$ -q cpu.q elijo # # imprime el nombre del nodo hostname #ejecuto el binario ./main
•
cpu.q: cola de ejecución en cpu
•
gpu.q: cola de ejecución en gpu
submit_cpu.sh
comandos del sistema de colas
la cola de ejecución
Sistema de colas compute-0-0 gpgpu-fisica.cabib.local 10.73.25.207
qsub submit_job.sh
compute-0-2
compute-0-1
Sistema de colas compute-0-0 gpgpu-fisica.cabib.local 10.73.25.207
qstat -f
job xx
compute-0-2
compute-0-1
25
Sistema de colas compute-0-0 gpgpu-fisica.cabib.local 10.73.25.207
submit_job.oxx
compute-0-2
compute-0-1
Módulos
La forma de incluir datos (Variables del Entorno, environment variables) para la compilación con distintos compiladores o bibliotecas.
Módulos flavioc@gpgpu-fisica ~]$ module avail ------------------------------------------ /usr/share/Modules/modulefiles --------------------------------------- dot module-info null rocks-openmpi_ib module-cvs modules rocks-openmpi use.own ------------------------------------------------- /etc/modulefiles ---------------------------------------------- openmpi-x86_64 ------------------------------------------ /share/apps/modules/modulefiles -------------------------------------- cuda lammpi/gnu mpich2/gnu openmpi/gnu intel/intel-12 lammpi/intel-12 mpich2/intel-12 openmpi/intel-12 [flavioc@gpgpu-fisica ~]$ module list Currently Loaded Modulefiles: 1) rocks-openmpi [flavioc@gpgpu-fisica ~]$ module load cuda-7.0 [flavioc@gpgpu-fisica ~]$ module list Currently Loaded Modulefiles: 1) rocks-openmpi 2) cuda-7.0 [flavioc@gpgpu-fisica ~]$
module load cuda-7.5