Upload
others
View
13
Download
0
Embed Size (px)
Citation preview
• 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.
• 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.
2. Random numbers y MonteCarlo.
3. Optimización.
4. Algebra Lineal.
5. Thrust.
6. FFT.
7. Streams.
8. Extras…
Tesla C2075,Tesla C2070
K20, GTX 780 (x5),
GTX 480
gpgpu-fisica.cabib.local (10.73.25.207)
CCAD - Bariloche , Gerencia de Física
sysadmin: Gustavo Berman
• 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)
• Flavio Colavecchia (Colisiones)
• Nicolás Chiaraviglio (Difra)
problemas, dudas, consultas sobre el curso en general
Usar el subject!
todos los alumnos + profesores
problemas, dudas, consultas particulares
Usar el subject!
email dirigido a los docentes
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 5.5, 2013.
biblio
• Envío de soluciones de problemas seleccionados de las guías de trabajos prácticos:
• Códigos fuente (correctness, performance, códigos co-men-ta-dos!)
• Una informe (una página) con los resultados del problema propuesto
• Fecha de entrega figura en cada nueva guía, estricto!
• Asistencia a todos los encuentros (se toma lista!!!)
• Final: multiple choice + un ejercicio en computadora
• Nota: 50% Final + 50% Problemas entregados
Evaluación
Acceso al cluster
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-0
compute-0-2
compute-0-1PuTTy
ssh
Acceso al cluster
13
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-0
compute-0-2
compute-0-1
login: fulano passwd: fulano.2013
Copiando los códigos[flavioc@gpgpu-‐fisica ~]$ ls /share/apps/codigos
common ejemplos_thrust SUMA-‐Vectores Hola_mundo
[flavioc@gpgpu-‐fisica ~]$ mkdir icnpg2013
[flavioc@gpgpu-‐fisica ~]$ cd icnpg2013/
[flavioc@gpgpu-‐fisica icnpg2013]$ cp -‐R /share/apps/codigos/Hola_mundo/ .
[flavioc@gpgpu-‐fisica icnpg2013]$ ls
Hola_mundo
[flavioc@gpgpu-‐fisica icnpg2013]$ 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 <stdio.h> #include <stdlib.h> #include <sys/time.h> #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 <stdio.h> #include <stdlib.h> #include <sys/time.h> #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; }
int imprime_hola_mundo();
hola_mundo_io.h
#include <stdio.h> #include "hola_mundo_io.h" !int imprime_hola_mundo() { printf("Hola Mundo!\n"); }
hola_mundo_io.c
main_hola_mundo.c
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 Consulta la cola de ejecución
• qdel xx Borrar el trabajo xx enviado
20
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 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ cpu.q@compute-‐0-‐0.local BIP 0/0/2 0.00 linux-‐x64 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ cpu.q@compute-‐0-‐1.local BIP 0/0/2 0.00 linux-‐x64 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ cpu.q@compute-‐0-‐2.local BIP 0/0/2 0.00 linux-‐x64 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ gpu.q@compute-‐0-‐0.local BIP 0/0/2 0.00 linux-‐x64 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ gpu.q@compute-‐0-‐1.local BIP 0/0/2 0.00 linux-‐x64 -‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐ gpu.q@compute-‐0-‐2.local BIP 0/0/2 0.00 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 # # imprime el nombre del nodo hostname #ejecuto el binario ./main
submit_cpu.sh
elijo la cola de ejecución
• cpu.q: cola de ejecución en cpu
• gpu.q: cola de ejecución en gpu
comandos del sistema de colas
Sistema de colas
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-0
compute-0-2
compute-0-1
qsub submit_job.sh
Sistema de colas
24
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-0
compute-0-2
compute-0-1
qstat -f
job xx
Sistema de colas
gpgpu-fisica.cabib.local 10.73.25.207
compute-0-0
compute-0-2
compute-0-1
submit_job.oxx
Módulos
La forma de incluir datos (Variables del Entorno, environment variables)
para la compilación con distintos compiladores o bibliotecas.
Módulosflavioc@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 [flavioc@gpgpu-‐fisica ~]$ module list Currently Loaded Modulefiles: 1) rocks-‐openmpi 2) cuda [flavioc@gpgpu-‐fisica ~]$ !