Computación en procesadores gráficos

Documentos relacionados
Computación en procesadores gráficos

Primeros pasos con CUDA. Clase 1

Modelo de aplicaciones CUDA

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

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

Memorias, opciones del compilador y otras yerbas. Clase 3

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

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

SUMA de Vectores: Hands-on

CUDA Overview and Programming model

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

Maribel Martínez y Ginés Ciudad-Real Fichas para mejorar la atención MATRIZ DE LETRAS

Librería Thrust. Clase 4.

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

DESARROLLO DE APLICACIONES EN CUDA

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

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Programación. Test Autoevaluación Tema 3

Apuntadores (Punteros)

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 5 Programación Avanzada y Optimización

TEMA 8: Gestión dinámica de memoria

PROGRAMACIÓN AVANZADA DE GPUs PARA APLICACIONES CIENTÍFICAS

cuevogenet Paralelización en CUDA de la Dinámica Evolutiva de Redes Génicas Dirigido por: Fernando Díaz del Río José Luis Guisado Lizar

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

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

FLAG/C. Una API para computación matricial sobre GPUs. M. Jesús Zafont Alberto Martín Francisco Igual Enrique S. Quintana-Ortí

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

Algoritmos y Programación I

Ejercicios de jerarquía de memoria

Escuela Politécnica Superior de Elche

Problema de las N Reinas. Resolución paralela

Introducción al lenguaje C

Prof. Dr. Paul Bustamante

Tema 3. Análisis de costes

Programación de GPUs con CUDA

Universidad Nacional de Ingeniería Facultad de Ciencias. Física Computacional CC063. Algebra Lineal. Prof: J. Solano 2012-I

Tema 13: Apuntadores en C

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA FACULTAD DE CIENCIAS PROGRAMA DE MATEMÁTICAS PLAN DE ESTUDIOS

Tema 14: Arreglos estáticos en C

Cursada Segundo Cuatrimestre 2012 Guía de Trabajos Prácticos Nro. 1

Universidad Complutense de Madrid FACULTAD DE INFORMÁTICA

6.1.- Introducción a las estructuras de datos Tipos de datos Arrays unidimensionales: los vectores Operaciones con vectores.

Programación Estructurada

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION

Optimización de Rutinas Multinivel de Álgebra Lineal en Sistemas Multicore

1. Manejo de memoria estática 2. Manejo de memoria dinámica

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

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

FUNDAMENTOS DE INFORMÁTICA

Seminario II: Introducción a la Computación GPU

Extracción paralela de valores propios en matrices Toeplitz simétricas usando hardware gráfico

SISTEMAS OPERATIVOS Arquitectura de computadores

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Vectores y matrices. Fundamentos de Programación Fundamentos de Programación I

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

Departamento de Arquitectura de computadores y electrónica Universidad de Almería. Tesis Doctoral

Nociones básicas de computación paralela

El método simplex 1. 1 Forma estándar y cambios en el modelo. 2 Definiciones. 3 Puntos extremos y soluciones factibles básicas. 4 El método simplex.

Universidad de Córdoba. Trabajo de Fin de Máster

Tema 5: Memorias. Espacio reservado para notas del alumno

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

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

INTRODUCCIÓN A LA COMPUTACIÓN PARALELA CON GPUS

Programación En Lenguaje C

Definición de Memoria

Optimización Software del Rendimiento Caché

Guía práctica de estudio 03: Algoritmos

GPU IMPLEMENTATIONS OF SCHEDULING HEURISTICS FOR HETEROGENEOUS COMPUTING ENVIRONMENTS

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

UNIDAD V: ARR R EGL G OS O BIDI D MENS N IONALE L S

Programación I Unidad III. Tema: Tipos, estructuras y uniones

Guía - Taller # 2 (JAVA)

MÓDULO SE: SISTEMAS DE ECUACIONES

Apuntadores en C y C++

FEM para Mecánica 3D. Miguel Ángel Otaduy. Animación Avanzada 7 de Marzo de 2014

PROCESAMIENTO DIGITAL DE SEÑALES TRABAJO FINAL PROFESOR: CRISTIAN FILTRO PASA BAJAS PARA SEÑAL DE SENSOR DE TEMPERATURA LM35

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

LAS unidades de procesamiento gráfico (GPUs)

Arquitecturas GPU v. 2013

REPASO ARRAYS MULTIDIMENSIONALES EN JAVA. DECLARACIÓN Y USO. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00905C)

Programación I. Arreglos. Prof. Lisbeth Pérez Rivas

Sistemas Distribuidos. Soporte de Sistemas Operativos

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

Flaviu Vasile Buturca TRABAJO FINAL DE CARRERA. Dirigido por Carles Aliagas Castell. Grado de Ingeniería Informática

Laboratorio de Paralelismo OpenMP: ejemplos y ejercicios

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Informática FACULTAD DE FÍSICAS

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

Es decir, det A = producto de diagonal principal producto de diagonal secundaria. Determinante de una matriz cuadrada de orden 3

TEMA 4. ESTRUCTURAS DE CONTROL

7ª Práctica. Matlab página 1 EJERCICIO 1. ORDENAR UN VECTOR CON EL MÉTODO DE LA BURBUJA...1

ACTIVIDADES SELECTIVIDAD MATRICES

Cuando el lenguaje si importa

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Este método se basa en buscar el elemento menor el vector y colocarlo en la primera

ARQUITECTURA BÁSICA DEL ORDENADOR: Hardware y Software. IES Miguel de Cervantes de Sevilla

Soluciones para entornos HPC

Qué es un programa informático?

Computación de Propósito General en Unidades de Procesamiento Gráfico GPGPU. Clase 0 Lanzamiento del Curso. Motivación

Transcripción:

Programación con CUDA Ejercicio 8 José Antonio Martínez García Francisco M. Vázquez López Manuel Ujaldón Martínez Portada Ester Martín Garzón Universidad de Almería

Arquitectura de las GPUs Contenidos Modelo de programación SIMT Claves computacionales para la programación de GPUs Programación con CUDA: Ejercicio 8 Supercomputación gráfica y arquitecturas emergentes 2

Ejercicio 8 Producto matriz densa por vector: u = A v Dimensiones A: N x M, u: N, v: M Inicializar A y v aleatoriamente Con <stdlib.h>: srand48(time(null)) para establecer semilla drand48() genera un float [0, ) Realizar código secuencial para comprobar que el kernel es correcto, comprobar con una matriz p.ej 5 x 5 Una vez comprobado, comprobar que la suma de los elementos del vector obtenido mediante la CPU es el mismo valor que se obtiene con la GPU Parámetros de entrada del programa: N: Número de filas M: Número de columnas BLOCKSIZE: Tamaño del bloque -D Verbose: Salida por pantalla si es Iterations: Iteraciones del kernel 3

Ejercicio 8: Código secuencial for (i = 0; i < N; i++) { u[ i ]=0; for (j = 0; j < M; j++) u[ i ]+=A[ i*m+ j ] * v[ j ]; } 4

Medir tiempos para: Transferencia CPU->GPU Ejecución del kernel Transferencia GPU->CPU, recordar si es necesario usar puntos de sincronización Calcular ocupación y bandwidth Obtener la tabla de tiempos usando los dos mejores valores de BLOCKSIZE y para A=000x2000, 2000x000, 2000x5000 y 5000x5000 Preguntas: Para qué estructuras (u, A, v) se realiza un acceso coalescente a memoria? Comentar topología de bloques/threads usada: Cuantos threads calculan una fila? Se podría usar más de thread por fila?. Ventajas/Inconvenientes Precisión en los resultados. Hay diferencias?, Por qué? 5

Mejoras a realizar: Usar la caché de texturas para almacenar el vector v Almacenar la matriz por columnas Qué se gana con esta optimización? Usar la memoria shared para realizar productos parciales de cada fila y usar más threads por fila Se te ocurre alguna optimización sobre la actualización de cada valor de u? Repetir el estudio de tiempos realizado para las optimizaciones planteadas y comparar con la versión inicial Obtener los ratios más importantes de cuda visual profiler 6

Ejercicio 8: Cuda Occupancy Calculator nvcc mv.cu o mv -Xptxas=-v 8 Registros + 48 bytes shared memory 6 32 64 28 256 52 9500 GT 33 % 33 % 67 % 00 % 00 % 67 % GTX 285 25 % 25 % 50 % 00 % 00 % 00 % 7

Ejercicio 8: Resultados para 9500 GT Iterations = 00, BLOCKSIZE = 28 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,0069 0,0068 0,007593 0,0858 Kernel 2,540294,967700 4,099960 35,0970 GPU-CPU 0,000095 0,000030 0,000035 0,000438 Bandwith 0,630000 0,83500 0,567400 0,570000 8

Ejercicio 8: Resultados para 9500 GT Iterations = 00, BLOCKSIZE = 256 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00607 0,00602 0,00738 0,07925 Kernel 2,565286,967527 4,8784 35,254478 GPU-CPU 0,000027 0,000030 0,000032 0,000752 Bandwith 0,623900 0,83600 0,566700 0,567400 9

Ejercicio 8 Preguntas: Por qué se obtiene mejor rendimiento para 2000x000 que para 000x2000? Por qué el bandwidth es extremadamente bajo? 0

Ejercicio 8: Resultados para 9500 GT usando caché de texturas Iterations = 00, BLOCKSIZE = 28 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00724 0,00645 0,007338 0,0824 Kernel,59832 0,965838 9,77806 22,942274 GPU-CPU 0,000023 0,000027 0,000029 0,000407 Bandwith,00300,657400 0,87800 0,87800

Ejercicio 8: Resultados para 9500 GT usando caché de texturas Iterations = 00, BLOCKSIZE = 256 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00675 0,00604 0,00743 0,0835 Kernel,596967 0,968404 9,7796 22,943222 GPU-CPU 0,00002 0,000405 0,000027 0,000035 Bandwith,00200,653000 0,87800 0,87800 2

Ejercicio 8: Resultados para 9500 GT usando caché de texturas y almacenamiento por columnas Iterations = 00, BLOCKSIZE = 28 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00627 0,00607 0,00744 0,0880 Kernel 0,368768 0,08387 0,4385 4,58994 GPU-CPU 0,000020 0,00002 0,000470 0,000408 Bandwith 2,70500 9,548000 9,682800 2,7900 3

Ejercicio 8: Resultados para 9500 GT usando caché de texturas y almacenamiento por columnas Iterations = 00, BLOCKSIZE = 256 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00622 0,0066 0,007400 0,08224 Kernel 0,368343 0,083784 0,4364 4,590678 GPU-CPU 0,000020 0,00002 0,000022 0,000040 Bandwith 2,73000 9,557900 9,683300 2,78800 4

Optimización: caché de texturas, almacenamiento por columnas, y 4 threads por fila Reserva dinámica de memoria shared Código host: int smemsize = BLOCKSIZE * sizeof(float); kernel<<<gridsize, blocksize, smemsize>>>( ); 5

Código device: template <typename T> struct SharedMemory { device T*getPointer(){ extern device void error(void); error(); return NULL; } }; template <> struct SharedMemory<float> { device float* getpointer(){ extern shared float s_float[]; return s_float; } }; 6

Declaración kernel: SharedMemory<float> smem; float *sdata = smem.getpointer(); 7

Ejercicio 8: Cuda Occupancy Calculator nvcc mv.cu o mv -Xptxas=-v 8 Registros + smem: 64 bytes estática + dinámica (blocksize*4) Shared memory 9500 GT GTX 285 6 28 bytes 33 % 25 % 32 92 bytes 33 % 25 % 64 320 bytes 67 % 50 % 28 576 bytes 00 % 00 % 256 088 bytes 00 % 00 % 52 22 bytes 67 % 00 % 8

Ejercicio 8: 9500 GT: caché de texturas, almacenamiento por columnas y 4 threads por fila Iterations = 00, BLOCKSIZE = 28 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00632 0,00632 0,00744 0,08292 Kernel 0,0988 0,08290 0,407398,024 GPU-CPU 0,00009 0,000020 0,00002 0,000027 Bandwith 8,7720 9,6500 9,820400 9,8900 9

Ejercicio 8: 9500 GT: caché de texturas, almacenamiento por columnas y 4 threads por fila Iterations = 00, BLOCKSIZE = 256 N x M/sec 000x2000 2000x000 2000x5000 5000x5000 CPU-GPU 0,00633 0,00609 0,007577 0,08003 Kernel 0,09539 0,082948 0,4074,0507 GPU-CPU 0,000020 0,000020 0,000022 0,000028 Bandwith 8,743800 9,654200 9,82000 9,888200 20

Ejercicio 8: Cuda Visual Profiler Iterations = 00, BLOCKSIZE = 256, 2000x5000 ª versión caché col+cach 4 T gputime 4344 9768 446 4086 cputime 4362 9790 470 409 occupancy gridsizex 8 8 8 32 gridsizey blocksizex 256 256 256 256 blocksizey blocksizez StaSmemperblock 48 48 48 64 2

Ejercicio 8: Cuda Visual Profiler Iterations = 00, BLOCKSIZE = 256, 2000x5000 ª versión caché col+cach 4 T Registersperthread 8 6 7 0 Sm_cta_launched 2 2 2 8 branch 8030 80098 80098 80648 divergentbranch 2 2 2 72 instructions 640507 800404 640388 642759 warp_serialize 0 0 0 0 cta_launched 4 4 4 6 22

Contraportada 23