clase0 la materia - fisica.cab.cnea.gov.ar la materia.pdf · con la arquitectura CUDA (Compute...

28
La Materia Aspectos Prácticos

Transcript of clase0 la materia - fisica.cab.cnea.gov.ar la materia.pdf · con la arquitectura CUDA (Compute...

La Materia

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.

• 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)

[email protected]

problemas, dudas, consultas sobre el curso en general

Usar el subject!

todos los alumnos + profesores

problemas, dudas, consultas particulares

[email protected]

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

¿ Dudas ?

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  ~]$    !

module load cuda