librería thrust - argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu...

34
Librería Thrust Clase 4 http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases

Upload: others

Post on 27-Jun-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Librería Thrust

Clase 4http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases

Page 2: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Hasta aquí...

● Control de bajo nivel del mapeo al hardware

● Desarrollo de algoritmos de alta performance.

● cálculos → ejecución en hilos en el device

CUDA C/C++

__global__ void mi_kernel(...)

{

extern __shared__ smem[];

int i = ???

// y aqui que hago???

}

...

int B = ???; int N = ???; int S = ???

mi_kernel<<<B,N,S>>>();

Page 3: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Librerías para Cuda

Podemos “delegar” ciertas implementaciones...

ALTONIVEL

BAJONIVEL(drivers)

Curso hasta ahora

Próximas clases...

Problema a Resolver

Numerica y concurrentemente

Page 4: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

“Productividad de codigo”: ● “No reinventar la rueda”, delegar ciertas implementaciones de tareas comunes a libs optimizadas.● Dedicar nuestro tiempo/esfuerzo/creatividad un poco menos al “como” y mas al “que” calcular ...

(reducir el tiempo de programacion)

Tareas muy especialeso muy simples, o que requieran un control total

Algebra lineal, Transformadas,Etc.

Tareas que se Descomponen en “Parallel Patterns” fundamentales

Page 5: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Librería Thrust

Clase 6http://fisica.cab.cnea.gov.ar/gpgpu/index.php/en/icnpg/clases

Page 6: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

¿ Que es Thrust ?

http://thrust.github.io/excelente documentación, muchos ejemplos

Page 7: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

¿ Necesito Thrust ?

¿ Para que/quien es ? https://developer.nvidia.com/content/expressive-algorithmic-programming-thrust

Parte del actual toolkit de cudahttps://developer.nvidia.com/thrust

Thrust facilita la escritura de código en CUDA C/C++(ver “CUDA Application Design and Development” de Rob Farber)

Page 8: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Ejemplos de clase

[koltona@gpgpu-fisica ejemplos]$ cp -r /share/apps/codigos/alumunos_icngp2015/clase_thrust .

Page 9: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Ejemplos de clase

[koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu[koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh

[koltona@gpgpu-fisica ejemplos]$ more script.sh#! /bin/bash##$ -cwd#$ -j y#$ -S /bin/bash## pido la cola gpu.q#$ -q gpu.q## pido una placa#$ -l gpu=1##ejecuto el binario

./a.out

Page 10: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Suma de arrays paralela en la GPU#include <thrust/device_vector.h>#include <thrust/transform.h>using namespace thrust::placeholders;int main(){ thrust::device_vector<float> x(4), y(4); x[0] = 1; x[1] = 2; x[2] = 3; x[3] = 4;

y[0] = 4; y[1] = 3; y[2] = 2; y[3] = 1;

thrust::transform(x.begin(), x.end(), y.begin(), y.begin(), _1 + _2 ); // y[] es ahora {5, 5, 5, 5} --> HANDS-ON: comprobar!}

● CudaMalloc?, CudaFree?● CudaMemCpy?● Kernel?

suma.cu

Page 11: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Combinación lineal de arrays

#include <thrust/device_vector.h>#include <thrust/transform.h>using namespace thrust::placeholders;

int main(){ thrust::device_vector<float> x(4), y(4); x[0] = 2; x[1] = 4; x[2] = 6; x[3] = 8;

y[0] = 4; y[1] = 3; y[2] = 2; y[3] = 1; float a=0.5;

thrust::transform(x.begin(), x.end(), y.begin(), y.begin(), a*_1 + _2 ); // y[] ahora es {5, 5, 5, 5} --> HANDS-ON: comprobar!}

saxpy.cu

Page 12: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Transformación arbitraria de dos arrays

#include <thrust/device_vector.h>#include <thrust/transform.h>

struct mi_operacion{ __device__ float operator()(float a, float b) {

return sqrt(a+b); }};int main(){

thrust::device_vector<float> x(4), y(4); x[0] = 1; y[0] = 4; // → sqrt(1+4)=sqrt(5)=2.23606797749979 X[1] = 2; y[1] = 3; x[2] = 3; y[2] = 2; X[3] = 4; y[3] = 1;

thrust::transform(x.begin(), x.end(), y.begin(), y.begin(),mi_operacion()); // HANDS-ON: da bien?}

transforma.cu

Page 13: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Normalización de un array#include <thrust/device_vector.h>#include <thrust/transform.h>#include <thrust/reduce.h>

struct mi_operacion // normaliza por N{ float Norm; mi_operacion(float suma){Norm=suma;}; __device__ float operator()(float a) { return a/Norm; }};

int main(){ thrust::device_vector<float> x(4), y(4); x[0] = 2; x[1] = 4; x[2] = 3; x[3] = 1;

float suma = thrust::reduce(x.begin(), x.end()); thrust::transform(x.begin(), x.end(), x.begin(),mi_operacion(suma)); // HANDS-ON: chequear que este normalizado...}

normaliza.cu

Page 14: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Normalización de un array (versión 2)#include <thrust/device_vector.h>#include <thrust/transform.h>#include <thrust/reduce.h>using namespace thrust::placeholders;

int main(){ thrust::device_vector<float> x(4), y(4); x[0] = 2; x[1] = 4; x[2] = 3; x[3] = 1;

float suma = thrust::reduce(x.begin(), x.end()); thrust::transform(x.begin(), x.end(), x.begin(),_1/suma); // HANDS-ON: chequear que este bien normalizado...}

normaliza2.cu

Page 15: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Normalización de un array (versión 3)

normaliza3.cu#include <thrust/device_vector.h>#include <thrust/transform.h>#include <thrust/reduce.h>

__global__ void kernel_normaliza(float *x, float suma, int dim){ int id = threadIdx.x + (blockIdx.x * blockDim.x); if (id < dim){ x[id] = x[id]/suma; }}int main(){ thrust::device_vector<float> x(4); x[0] = 2; x[1] = 4; x[2] = 3; x[3] = 1; float suma = thrust::reduce(x.begin(), x.end());

float * x_ptr = thrust::raw_pointer_cast(&x[0]); kernel_normaliza<<<1,4>>>(x_ptr,suma,4); // HANDS-ON: chequear que este normalizado...}

Interoperabilidad

Page 16: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Normalización de un array (versión 4)

normaliza4.cu

Interoperabilidad

#include <thrust/device_ptr.h>#include <thrust/device_free.h>#include <thrust/transform.h>#include <thrust/reduce.h>using namespace thrust::placeholders;int main(void){ float *raw_ptr; cudaMalloc((void **)&raw_ptr, 4*sizeof(float)); thrust::device_ptr<float> x(raw_ptr);

x[0] = 2; x[1] = 4; x[2] = 3; x[3] = 1;

float suma = thrust::reduce(x, x+4); thrust::transform(x,x+4,x,_1/suma);// en CPU o GPU?

// HANDS-ON: chequear que este bien normalizado...

thrust::device_free(x); return 0;}

Page 17: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Ejemplos de la librería

[koltona@gpgpu-fisica ejemplos]$ cp /share/apps/codigos/thrust_examples/xxxxx.cu .[koltona@gpgpu-fisica ejemplos]$ nvcc xxxxx.cu[koltona@gpgpu-fisica ejemplos]$ qsub script.sh

[koltona@gpgpu-fisica ejemplos]$ more script.sh#! /bin/bash##$ -cwd#$ -j y#$ -S /bin/bash## pido la cola gpu.q#$ -q gpu.q## pido una placa#$ -l gpu=1##ejecuto el binario

./a.out

Page 18: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Overview de thrusthttp://thrust.github.io/

//#includes...int main(void){ // generate 32M random numbers serially thrust::host_vector<int> h_vec(32 << 20); std::generate(h_vec.begin(), h_vec.end(), rand);

// transfer data to the device thrust::device_vector<int> d_vec = h_vec;

// sort data on the device (846M keys per second on GeForce GTX 480) thrust::sort(d_vec.begin(), d_vec.end());

// transfer data back to host thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());

return 0;}

Page 19: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

¿ Que tipo de algoritmos tiene Thrust ?

“Parallel building blocks”

Page 20: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

4 7 5 9

11 14

25

3 1 7 0 4 1 6 3

Calcula la suma

+

Vale para int, float, double,o cualquier tipo de dato con la operación “+” bien definida...

+ + +

++

+

Page 21: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

3 7 4 6

7 6

7

3 1 7 0 4 1 6 3

Calcula el máximo

“>”

Vale para int, float, double,o cualquier tipo de dato con la operación “>” bien definida...

A “>” B = (A>B)?(A):(B)

“>” “>” “>”

“>”“>”

“>”

Page 22: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Calcula el campeón

“play”

ATP MADRID:64 players63 partidos en 6 jornadas

Mutua Madrid OpenSpain - 07.05.2012-13.05.2012Draw: 64Surface: ClayPrize Money: €3,090,15063 partidos en 6 jornadas

Name: Roland GarrosCategory: Grand SlamPlace: Paris, FranceDate: 27.05.2012-10.06.2012Draw Size: S-128 D-64

log_2(N) operaciones: Grand-Grand-Slam: 2^20 = 1048576 jugadores → solamente 20 “jornadas” !!!

“play”

“play”

“play” “play”

“play”

Page 23: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Reducción genérica en Thrust

Cualquier operacion binaria asoc. y conmutativa(+,-,*, max, min, etc, o user-defined) definida sobre cualquier estructura de datos

(int, float, etc, o user-defined),

Viva en el HOST o en el DEVICE (GPU)Generic algorithms

Page 24: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

ThrustThrust Content from GTC 2012: Nathan Bell

Principales desarroladores: Jared Hoberock y Nathan Bell

Page 25: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

ThrustThrust Content from GTC 2012: Nathan Bell

Page 26: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

ThrustThrust Content from GTC 2012: Nathan Bell

Page 27: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Thrust Content from GTC 2012: Nathan Bell

MISMO códigoCorre en CPU Multicore!!

Delegamos la implementaciónde bajo nivel o “mapeo al hardware” a la librería

Thrust

Page 28: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Thrust Portability: Hands on! Un solo codigo fuente → dos ejecutables

nvcc -O2 -o miprog_cpu miprog.cu -Xcompiler -fopenmp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -lgomp

#! /bin/bash

#$ -cwd

#$ -j y

#$ -S /bin/bash

#$ -q cpu.q

#$ -pe neworte 14

export OMP_NUM_THREADS=$NSLOTS

echo "nro threads omp = " $OMP_NUM_THREADS

./miprog_cpu

nvcc -O2 -o miprog_gpu miprog.cu

#! /bin/bash

#$ -cwd

#$ -j y

#$ -S /bin/bash

#$ -q gpu.q

#$ -l gpu=1

./miprog_gpu

Page 29: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Thrust Portability: Hands on!

cp miprog.cu miprog.cpp //extension para g++

g++ -O2 -o miprogcpu miprog.cpp -fopenmp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP -lgomp -I<path-to-thrust-headers>

No necesitan el cuda toolkit para desarrollar, compilar y correr sus codigos (claro, si estos usan solo thrust). Solo copiar los headers de thrust.Pueden comparar aceleración del calculo paralelo en distintas CPU multicore, y cambiar la variable OMP_NUM_THREADS.Cuando tengan acceso a una placa, pueden comparar la aceleración simplemente recompilando con nvcc.

TODO CON EL MISMO CODIGO.

Page 30: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

ThrustCUDA Toolkit 5.0 Performance Report

Page 31: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Ejemplo: reducción OMP vs GPU

● Tareas:

– hacer la suma de N numeros random, usando thrust::generate y thrust::reduce.

– Encontrar el minimo de N numeros random, usando thrust::generate y thrust::reduce.

Page 32: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

ThrustThrust Content from GTC 2012: Nathan Bell

La mayoría son“Parallel primitives”

Thrust se puede usarpara alivianar la escriturade gran parte del código:

Alocación de memoria, copias, y composición de patrones paralelas.

Page 33: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Limitaciones de Thrust

https://developer.nvidia.com/content/expressive-algorithmic-programming-thrustReview de M. Harris en:

Usualmente en Cuda C/C++o librerias nuevas de masbajo nivel que Thrust como CUB

GTC 2012 Nathan Bell

Page 34: Librería Thrust - Argentina.gob.ar · [koltona@gpgpu-fisica clase_thrust]$ nvcc xxxxx.cu [koltona@gpgpu-fisica clase_thrust]$ qsub submit.sh [koltona@gpgpu-fisica ejemplos]$ more

Resumen

https://developer.nvidia.com/content/expressive-algorithmic-programming-thrustReview de M. Harris en:

THRUST IS HIGH LEVEL

THRUST IS HIGH PERFORMANCE

THRUST IS OPEN SOURCE

THRUST IS INTEROPERABLE AND PORTABLE

THRUST IS CUSTOMIZABLE

LIMITATIONS OF THRUST (DESACTUALIZADO)