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



Documentos relacionados
SUMA de Vectores: Hands-on

Tutorial CUDA Univ. de Santiago. 6 y 7 de Agosto, 2013

Introducción a Cómputo Paralelo con CUDA C/C++

Memorias, opciones del compilador y otras yerbas. Clase 3

GPGPU Avanzado. Sistemas Complejos en Máquinas Paralelas. Esteban E. Mocskos 5/6/2012

Modelo de aplicaciones CUDA

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

CUDA: MODELO DE PROGRAMACIÓN

Programando con memoria unificada. Contenidos [15 diapositivas] Aportaciones de la memoria unificada. I. Descripción

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU

Primeros pasos con CUDA. Clase 1

CUDA Overview and Programming model

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Cómputo en paralelo con OpenMP 1

Técnicas de paralelización de código para robots basados en emociones

Arquitecturas GPU v. 2013

Tema: Arreglos de Objetos en C++.

Heterogénea y Jerárquica

Francisco J. Hernández López

CUDA (Compute Unified Device Architecture)

Capítulo 1 Introducción a la Computación

Sistemas Operativos. Curso 2016 Procesos

GPU-Ejemplo CUDA. Carlos García Sánchez

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS

PROPUESTA DE MINOR. En caso de tomar el electivo: trabajar desarrollando software en grupo planificar el desarrollo del software

Bloque IV. Prácticas de programación en CUDA. David Miraut Marcos García Ricardo Suárez

Informática FACULTAD DE FÍSICAS

Introducción a la Arquitectura y Plataforma de Programación de Cómputo Paralelo CUDA (36 hrs) Instructor M. en C. Cristhian Alejandro Ávila-Sánchez

Practica 01: Programación en C bajo Linux y funciones

FUNDAMENTOS DE COMPUTACIÓN PARA CIENTÍFICOS. CNCA Abril 2013

Ejemplos de optimización para Kepler. 1. Balanceo dinámico de la carga. Contenidos de la charla [18 diapositivas]

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Arquitecturas y programación de procesadores gráficos. Nicolás Guil Mata Dpto. de Arquitectura de Computadores Universidad de Málaga

Se guardan en archivos con extencion c y los cabezales con extension h

Utilización de la programación paralela en procesadores gráficos para el cálculo científico.

Tema 5: Diseño modular. Índice. Notas. Programación 2. Curso Notas. Ejemplo. La herramienta make. 1 Diseño modular.

Introducción a la programación orientada a objetos

Programación Híbrida e Introducción a la Programación de GPUs

Computación Científica en Paralelo

Una mirada práctica a los Micro-Kernels y los Virtual Machine Monitors François Armand, Michel Gien INFORMATICA III

Examen escrito de Programación 1

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

Computación matricial dispersa con GPUs y su aplicación en Tomografía Electrónica

4. Programación Paralela

Diseño Lógico I Facultad de Ciencias Exactas y Tecnología UNT. LENGUAJES DE DESCRIPCIÓN DE HARDWARE

CÓMPUTO DE ALTO RENDIMIENTO EN MEMORIA COMPARTIDA Y PROCESADORES GRÁFICOS

Kepler. 1. Presentación de la arquitectura. Índice de contenidos [25 diapositivas] Kepler, Johannes ( )

Se ha desarrollado el siguiente programa principal. Se pide: arquitectura que permita una fácil extensión

General Parallel File System

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Coordinación n de Componentes mediante Conectores Implementados con Servicios Web

Actividades de Divulgación del Centro Atómico Bariloche. Qué hay detrás de un programa de computadora? Daniela Arnica Pablo E. Argañaras.

LABORATORIO 1 OPERACIONES DE ENTRADA Y SALIDA

Lección 4: Suma y resta de números racionales

picojava TM Características

Introducción. Por último se presentarán las conclusiones y recomendaciones pertinentes.

Tema 4: Estructuras de Control Estructura y Contenidos

Introducción al lenguaje de programación java

Ecuaciones de primer grado con dos incógnitas

TEMA 3. EL PROCESO DE COMPILACIÓN, DEL CÓDIGO FUENTE AL CÓDIGO MÁQUINA

Curso 0 de Informática

INTRODUCCIÓN A LA PROGRAMACIÓN DE GPUS CON CUDA

High Performance Computing and Architectures Group

Entorno de Programación Visual Studio 6

Programación Concurrente

Lenguaje de Programación: Go

Metodología de la Programación II. Recursividad

Desarrollo de Programas Eficientes

Preliminares. Tipos de variables y Expresiones

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 0. Entorno de programación: atcgrid y gestor TORQUE

El lenguaje de Programación C. Fernando J. Pereda

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Concurrencia: Exclusión mutua y Sincronización

GPU IMPLEMENTATIONS OF SCHEDULING HEURISTICS FOR HETEROGENEOUS COMPUTING ENVIRONMENTS

Control Digital en PC con MS-DOS

LENGUAJE. Tema 1 - Introducción

Arquitectura de Computadores: Exámenes y Controles

Contenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones

Tema: INTÉRPRETE ENSAMPOCO/3

APÈNDIX: PREPROCESSADOR C

TEMA 1. Introducción

Plataformas paralelas

Fundamentos de la Programación

Trabajo Práctico N 4: Diseño por Contratos

Introducción al laboratorio de Programación I

Valor agregado del producto

Implementación de algoritmos genéticos paralelos de grano burdo en redes locales de computadoras. Resumen

Pipelining o Segmentación de Instrucciones

Simulaciones de Física Estadística usando GPGPU: tres herramientas

Introducción a la Programación de Memoria Compartida.. con OpenMP

1. INVERSA DE UNA MATRIZ REGULAR

Estructura de datos tipo vector.

Secuencias. Mauro Jaskelioff 18/05/2015

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Curso de Doctorado: Tecnologías de Objetos

jpicusb: Clase Java para comunicación USB con PICs usando API de Microchip

Transcripción:

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

Hasta aquí... CUDA C/C++ Control de bajo nivel del mapeo al hardware Desarrollo de algoritmos de alta performance. cálculos ejecución en hilos en el device global void mi_kernel(...) { extern shared smem[]; int i =??? // y aqui que hago??? }... int B =???; int N =???; int S =??? mi_kernel<<<b,n,s>>>();

Problema a Resolver Numerica y concurrentemente Librerías para Cuda ALTO NIVEL Próximas clases... Curso hasta ahora BAJO NIVEL (drivers) Podemos delegar ciertas implementaciones...

Tareas muy especiales o muy simples, o que requieran un control total Tareas que se Descomponen en Parallel Patterns fundamentales Algebra lineal, Transformadas, Etc. 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)

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

Que es Thrust? http://thrust.github.io/ excelente documentación, muchos ejemplos

Necesito Thrust? Para que/quien es? https://developer.nvidia.com/content/expressive-algorithmic-programming-thrust Parte del actual toolkit de cuda https://developer.nvidia.com/thrust Thrust facilita la escritura de código en CUDA C/C++ (ver CUDA Application Design and Development de Rob Farber)

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

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

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; suma.cu y[0] y[1] y[2] y[3] = = = = 4; 3; 2; 1; CudaMalloc?, CudaFree? CudaMemCpy? Kernel? thrust::transform(x.begin(), x.end(), y.begin(), y.begin(), _1 + _2 ); // y[] es ahora {5, 5, 5, 5} --> HANDS-ON: comprobar! }

Combinación lineal de arrays #include <thrust/device_vector.h> #include <thrust/transform.h> using namespace thrust::placeholders; saxpy.cu 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! }

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() { transforma.cu 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? }

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; } }; normaliza.cu 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... }

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; normaliza2.cu 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... }

Normalización de un array (versión 3) #include <thrust/device_vector.h> #include <thrust/transform.h> #include <thrust/reduce.h> normaliza3.cu 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

Normalización de un array (versión 4) #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; normaliza4.cu 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; } Interoperabilidad

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

Overview de thrust http://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; }

Que tipo de algoritmos tiene Thrust? Parallel building blocks

3 1 7 0 4 1 6 3 + + + + 4 7 5 9 + 11 + 14 + 25 Calcula la suma Vale para int, float, double,o cualquier tipo de dato con la operación + bien definida...

3 1 7 0 4 1 6 3 > > > > 3 7 4 6 > 7 > 6 > 7 A > B = (A>B)?(A):(B) Calcula el máximo Vale para int, float, double,o cualquier tipo de dato con la operación > bien definida...

play play play play play play Mutua Madrid Open Spain - 07.05.2012-13.05.2012 Draw: 64 Surface: Clay Prize Money: 3,090,150 63 partidos en 6 jornadas ATP MADRID: 64 players 63 partidos en 6 jornadas Name: Roland Garros Category: Grand Slam Place: Paris, France Date: 27.05.2012-10.06.2012 Draw Size: S-128 D-64 Calcula el campeón log_2(n) operaciones: Grand-Grand-Slam: 2^20 = 1048576 jugadores solamente 20 jornadas!!!

Reducción genérica en Thrust Cualquier operacion binaria asoc. y conmutativa (+,-,*, max, min, etc, o user-defined) Generic algorithms definida sobre cualquier estructura de datos (int, float, etc, o user-defined), Viva en el HOST o en el DEVICE (GPU)

Thrust Thrust Content from GTC 2012: Nathan Bell Principales desarroladores: Jared Hoberock y Nathan Bell

Thrust Thrust Content from GTC 2012: Nathan Bell

Thrust Thrust Content from GTC 2012: Nathan Bell

Thrust MISMO código Corre en CPU Multicore!! Thrust Content from GTC 2012: Nathan Bell Delegamos la implementación de bajo nivel o mapeo al hardware a la librería

Thrust Portability: Hands on! Un solo codigo fuente dos ejecutables nvcc -O2 -o miprog_cpu miprog.cu -Xcompiler -fopenmp -DTHRUST_DEVICE_SYSTEM=THRUST_DEVI CE_SYSTEM_OMP -lgomp #! /bin/bash #$ -cwd nvcc -O2 -o miprog_gpu miprog.cu #! /bin/bash #$ -cwd #$ -j y #$ -j y #$ -S /bin/bash #$ -S /bin/bash #$ -q cpu.q #$ -q gpu.q #$ -pe neworte 14 #$ -l gpu=1 export OMP_NUM_THREADS=$NSLOTS echo "nro threads omp = " $OMP_NUM_THREADS./miprog_cpu./miprog_gpu

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.

Thrust CUDA Toolkit 5.0 Performance Report

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.

Thrust Thrust Content from GTC 2012: Nathan Bell La mayoría son Parallel primitives Thrust se puede usar para alivianar la escritura de gran parte del código: Alocación de memoria, copias, y composición de patrones paralelas.

Limitaciones de Thrust Review de M. Harris en: https://developer.nvidia.com/content/expressive-algorithmic-programming-thrust GTC 2012 Nathan Bell Usualmente en Cuda C/C++ o librerias nuevas de mas bajo nivel que Thrust como CUB

Resumen Review de M. Harris en: https://developer.nvidia.com/content/expressive-algorithmic-programming-thrust THRUST IS HIGH LEVEL THRUST IS INTEROPERABLE AND PORTABLE THRUST IS HIGH PERFORMANCE THRUST IS OPEN SOURCE THRUST IS CUSTOMIZABLE LIMITATIONS OF THRUST (DESACTUALIZADO)