ICNPG Aspectos Prácticos

ICNPG 2016 Aspectos Prácticos • Aprendizaje de nuevas técnicas de programación para explotar el potencial de las GPUs (tarjetas gráficas) como dispo

1 downloads 24 Views 1MB Size

Story Transcript

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

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.