Вы находитесь на странице: 1из 161

Taller: Introduccin a GPU's y Programacin CUDA para HPC

Amilcar Meneses Viveros Departamento de Computacin CINVESTAV-IPN / LUFAC Computacin Julio 2011

Friday, October 21, 2011

CONTENIDO
I.- INTRODUCCION A GPU's Y CUDA 1.1 Preliminares de programacin y computacin paralela. 1.2 Arquitecturas basadas en GPU's. 1.3 El ambiente de desarrollo CUDA. II. PRINCIPIOS Y CONCEPTOS DE PROGRAMACION CUDA 2.1 Tipos de funciones y manejo de memoria. 2.2 Bloques y grids. III.- ESTRUCTURA DE LOS PROGRAMAS CUDA 3.1 Uso de codigo C y C++ 3.2 Codigo CUDA (.cu) 3.3 El ambiente de desarrollo con Eclipse IV.- EJEMPLOS Y EJERCICIOS 4.1 Ejemplos con programas de manejo de matrices y vectores: suma, resta, multiplicacin, mtodo gaussjordan. V.- COOPERACION ENTRE HILOS 5.1 Manejo de bloques 5.2 Sincronizacin y memoria compartida

Friday, October 21, 2011

Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE I: Introduccin a GPU's y CUDA

Friday, October 21, 2011

Preliminares- Computacin paralela

Computacin serial

Friday, October 21, 2011

Preliminares - Computacin paralela

Computacin paralela

Friday, October 21, 2011

Preliminares - Computadora paralela


Computadora con mltiples procesadores que soporta programacin paralela. Hay dos categorias importantes de computadoras paralelas: multicomputadoras y multiprocesadores centralizados.

Friday, October 21, 2011

Preliminares - Computadora paralela


Computadora con mltiples procesadores que soporta programacin paralela. Hay dos categorias importantes de computadoras paralelas: multicomputadoras y multiprocesadores centralizados. Multicomputadora: es una computadora paralela construida por mltiples computadoras y una red de interconeccin.

Memoria CPU

Memoria CPU

Memoria CPU

RED

Friday, October 21, 2011

Preliminares - Computadora paralela


Computadora con mltiples procesadores que soporta programacin paralela. Hay dos categorias importantes de computadoras paralelas: multicomputadoras y multiprocesadores centralizados. Multiprocesador centralizado: (o SMP) es un sistema ms integrado donde todos los CPUs comparten el acceso a una memoria global.
Memoria CPU CPU CPU

SMP: Symmetric Multiprocessors


Friday, October 21, 2011

Preliminares - Computadora paralela


Computadora con mltiples procesadores que soporta Memoria programacin paralela. Hay dos categorias importantes CPU CPU CPU de computadoras paralelas: multicomputadoras y multiprocesadores centralizados. Multiprocesador centralizado: (o SMP) es un sistema ms integrado donde todos los CPUs comparten el acceso a una Memoria memoria global. CPU CPU CPU

Memoria CPU CPU CPU

Memoria CPU CPU CPU

SMP: Symmetric Multiprocessors


Friday, October 21, 2011

Preliminares - Programacin paralela


Es la programacin en un lenguaje que permita indicar explicitamente como distintas partes de una computacin pueden ejecutarse concurrentemente por diferentes procesadores.

Friday, October 21, 2011

Preliminares - Tipos de paralelismo

Tiempo

Pipeline

Tiempo

Paralelismo a nivel dato (DLP)

Tiempo

Paralelismo a nivel thread (TLP) Paralelismo a nivel instruccin (ILP)

Friday, October 21, 2011

Tiempo

Preliminares - Paralelizacin Paralelizacin Implcita Explcita

Hardware Compilador Lenguajes Bibliotecas


Arquitecturas Directivas del compilador Sentencias del lenguaje
Funciones de sincronizacin, manejo de seccion crtica,...

Friday, October 21, 2011

Preliminares - Proceso
Arquitectura von Neumann Programa residente en memoria

MEMORIA
Carga Ejecuta

CPU

Friday, October 21, 2011

Preliminares - Proceso
Programa cargado en memoria que est en ejecucin o listo para ejecucin

Datos globales y estticos. Memoria dinmica

rea de datos

.... #define N 100000000000 int varGlobal; float arregloGlobal[N]

Cdigo ejecutable.

rea de cdigo

int funcionSuma(int a, int b){ return a+b; } ...

Datos locales: argumentos y variables denidas en una funcin

rea de pila

int main(int argc, char **argv){ int varLocal; varLocal r = suma(5,7); }


14

Friday, October 21, 2011

Preliminares - Proceso
Proceso multithreading tiene un hilo principal y un conjunto de procesos esclavos.

Datos globales y estticos. Memoria dinmica

rea de datos

Esquema de multithreading Hilos de POSIX Hilos OpenMP

Cdigo ejecutable.

rea de cdigo
Hilo principal (512MB)

Controlados por el SO a nivel usuario o a nivel kernel.

Datos locales: argumentos y variables denidas en una funcin

rea de pila

Hilo esclavo 1 (4MB)


15

Hilo esclavo N (4MB)

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


Se requieren ms transistores en CPU para mejorar el rendimiento (se doblan cada 18 meses segn la ley de Moore)

Samuel H. Fueller & Lynette I. Millett. Computer, IEEE, pp. 31-38, January 2011.

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


Se requieren ms transistores en CPU para mejorar el rendimiento (se doblan cada 18 meses segn la ley de Moore) ILP - Paralelismo a nivel instruccin. Superscalar - Mltiples unidades funcionales. Superpipelining - Altas frecuencias. Hyperthreading - Mltiples ujos de ejecucin para utilizar recursos ociosos. Aumento en los ciclos de reloj 3.8 GHz: dispacin de calor y consumo de energa

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


CPU: Tecnologas multicore. Para 2010 no habr ms procesadores de 1 core

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


CPU: Tecnologas multicore. Se planea que para 2010 no habr ms procesadores de 1 core

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


CPU: Tecnologas multicore. Se planea que para 2010 no habr ms procesadores de 1 core

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento


CPU: Tecnologas multicore. Se planea que para 2010 no habr ms procesadores de 1 core

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento

Friday, October 21, 2011

Nmero de ncleos

Preliminares - Computacin de alto rendimiento

Teraops

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento

Teraops

Friday, October 21, 2011

Preliminares - Computacin de alto rendimiento

nvidia TESLA 448 cores GPUs

Teraops

Friday, October 21, 2011

Computacin de alto rendimiento

Rendimiento de tarjetas GPGPUs

Friday, October 21, 2011

Computacin de alto rendimiento

Glenn Lupton, Don Thulin, Accelerating HPC Using GPUs; white paper; Hewlett-Packard Company June 13, 2008.

Friday, October 21, 2011

Tecnologas de GPGPUs
Unidades de procesamiento grco de propsito general. Procesadores vectoriales. Fabricantes: nVidia, ATI, Intel... La idea es aprovechar las unidades aritmticas y lgicas de los GPUs para hacer computaciones de alto rendimiento.

Friday, October 21, 2011

GPGPUS - Procesadores vectoriales

Procesador escalar opera sobre nmeros sencillos (escalares). Procesadores vectoriales operan en vectores de nmeros.

Friday, October 21, 2011

GPGPUS - Procesadores vectoriales


Benecios de los procesadores vectoriales Compacto: una simple instruccin dene N operaciones. Ademas reduce la frecuencia de saltos. Paralelo: N operaciones son paralelas en datos. No hay dependencias. No se requiere de HW para detectar paralelismo. Puede ejecutar en paralelo asumiento N ujos de datos paralelos. Usa patrones de acceso a memoria continua.

Friday, October 21, 2011

CPU vs GPU

CPU
Baja latencia de memoria. Acceso aleatorio. 20GB/s ancho de banda. 0.1Top. 1Gop/watt Modelo de programacin
altamente conocido.

GPU
Gran ancho de banda. Acceso secuencial. 100GB/s ancho de banda. 1Top. 10 Gop/watt Modelo de programacin muy
poco conocido.

Friday, October 21, 2011

CPU vs GPU

Friday, October 21, 2011

Que es GPGPU ?
Computacin de propsito general usando GPU y API de grcas en aplicacin es distintas a grcos en 3D. GPU acelera la trayectoria crtica de una aplicacin. Algoritmos paralelos sobre datos aprovechan los atributos del GPU. Grandes arreglos de datos, rendimiendo de streaming. Paralelismo de grano no SIMD. Computaciones de punto otante de baja latencia. Aplicaciones ver //GPGPU.org Efectos fsicps de video juegos (FX), procesamiento de imgenes. Modelado fsico, ingeniera computacional, algebra matricial, convolucin, correlacin, ordenamientos.
33
Friday, October 21, 2011

Restricciones previas de GPGPU


Trabajar con API diseados para grcas Modos de direccionamiento
Tamaos de textura
Input Registers

per thread per Shader per Context

Salida limitada Conjunto de instrucciones


Falta de operaciones Integer & bit

Fragment Program

Texture Constants Temp Registers

Comunicacin limitada
Entre pixeles Dispersin a[i] = p

Output Registers FB Memory

34
Friday, October 21, 2011

CUDA
Compute Unied Device Architecture Modelo de programacin de propsito general El usuario inicializa conjuntos de threads en el GPU GPU = super-threaded dedicado para procesamiento masivo de datos (co-processor) Conjunto de software dedicado Manejadores de dispositivos, lenguaje y herramientas. Manejador para carga de programas al GPU Manejador Independiente - Optimizado para computaciones Interfaz diseada para computaciones - API no grca Comparte datos con objetos OpenGL en buffer Aceleracin garantizada en los accesos a memoria Manejo explicito de la memoria del GPU
35
Friday, October 21, 2011

Esquema general de Hardware


A nivel alto, una tarjeta grca PCI con muchos GPUs y dispositivo de memoria de video de acceso rpido convive en un servidor con uno o dos CPUs multicore.

motherboard

tarjeta grca

Friday, October 21, 2011

Esquema general de Hardware


Una tarjeta grca. Los GPUs se agrupan en mdulos llamados SM (Streaming Multiprocessors).

SM: grupo de GPUs Tarjeta grca: grupo de SM


Friday, October 21, 2011

GPUs en los servidores actuales


Coprocesadores del CPU. Conexin PCIe (8GB/s) por direccion. Memoria independiente del GPU (gran ancho de banda local, hasta 100GB/s).

Friday, October 21, 2011

Un ejemplo del manejo de hardware para CUDA


CPU (host)

GPU w/ local DRAM (device)

39 Friday, October 21, 2011

Conguraciones de HW

GPU1

GPU2

GPU3

GPU4

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Friday, October 21, 2011

Conguraciones de HW a) b)

c)

d)

41 Friday, October 21, 2011

Ejemplo: G80 de nVidia

Host Input Assembler


Thread Execution Manager

Parallel Data Cache Texture Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Load/store

Load/store

Load/store

Load/store

Load/store

Load/store
42

Global Memory
Friday, October 21, 2011

Computacin paralela en GPU


8-series GPUs proporcionar de 25 a 200+ GFLOPS en aplicaciones paralelas compiladas en C Disponible en laptops, desktops, y clusters El paralelismo eh GPU se duplica cada ao Modelo de programacin escala de forma transparente

GeForce 8800

Tesla D870

Programacin en C con herramientas CUDA Modelo multihilos SPMD utiliza paralelismo en datos y en hilos.

Tesla S870
43
Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

OpenCL
Open Computing Language (OpenCL). Framework para escribir programas que se ejecuten en plataformas heterogneas (CPUs multicore y GPUs).

Modelo heterogneo

Friday, October 21, 2011

OpenCL
Originalmente fue desarrollador por Apple (con colaboracin de AMD, IBM, INTEL, nVidia). Apple manda la propuesta inicial al grupo Krhonos en 2008.

Friday, October 21, 2011

OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.

Compila para GPU

Compila para CPU

Cdigo GPU

Cdigo CPU

Friday, October 21, 2011

OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.

Friday, October 21, 2011

OpenCL
Dene OpenCL C - Variante del ISO C99 optimizado para la computacin en GPU. Computacin paralela masiva basada en SPMD.

1) Busca GPU disponibles y genera colas de comandos


Friday, October 21, 2011

2) Se especican los datos y los kernels necesarios. El RT manda los datos a la RAM de los GPUs.

OpenCL
Modelo de memoria.

Friday, October 21, 2011

OpenCL
Modelo de memoria.

Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

CUDA
Compute Unied Device Architecture Modelo de programacin de propsito general El usuario inicializa conjuntos de threads en el GPU GPU = super-threaded dedicado para procesamiento masivo de datos (co-processor) Conjunto de software dedicado Manejadores de dispositivos, lenguaje y herramientas. Manejador para carga de programas al GPU Manejador Independiente - Optimizado para computaciones Interfaz diseada para computaciones - API no grca Comparte datos con objetos OpenGL en buffer Aceleracin garantizada en los accesos a memoria Manejo explicito de la memoria del GPU
54 Friday, October 21, 2011

CUDA programacin basada en C


Aplicacion (programa C) integrada al host+device Partes de cdigo C no paralelo o modestamente paralelo corre en el host Partes altamente paralelas en (SPMD kernel C code) device Serial Code (host) Parallel Kernel (device) KernelA<<< nBlk, nTid >>>(args);

...

Serial Code (host) Parallel Kernel (device) KernelB<<< nBlk, nTid >>>(args);

...
55

Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

Brook+
Lenguaje de programacin desarrollado por Stanford University. Desarrollado para utilizar tarjetas aceleradoras grcas (GPU) para hacer computaciones de propsito general. Extencin del lenguaje C.

Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

DirectCompute
API desarrollado por Microsoft para desarrollar aplicaciones de propsito especco en unidades de GPU. Corre en Windows Vista y Windows 7. Lenguaje HLSL, sintaxis similar a C.

Friday, October 21, 2011

Plataformas de desarrollo
Frameworks, lenguajes y herramientas que nos permiten crear programas que corran en arquitecturas de GPGPUs. OpenCL CUDA Brook+ DirectCompute CAPS

Friday, October 21, 2011

CAPS
Software desarrollado por la compaia HPC Project. Genera cdigo para GPUs al estilo OpenMP a partir de cdigo C o FORTRAN.

Friday, October 21, 2011

Contenido
Introduccin a HPC Tecnologa de GPGPU Plataformas de desarrollo Estrategias de programacin Comentarios nales y conclusiones

Friday, October 21, 2011

Estrategias de programacin
Buscar particionamiento sobre datos (SPMD). Dominio del problema. Estrategia de paralelismo incremental. Generar operaciones de grano no.

Tamao del grano: nmero de computaciones que se ejecutan entre la comunicacin y la sincronizacin.

Friday, October 21, 2011

Ejecucin de hilos

SM1

SM2

SM3

SM4

Friday, October 21, 2011

Ejecucin de hilos

SM1

SM2

SM3

SM4

Friday, October 21, 2011

Manejo de cache Kernel alineado

Kernel disperso

Friday, October 21, 2011

Recordando la arquitectura FERMI


Jerarqua de memoria

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Friday, October 21, 2011

Registros
Por omisin, variables locales de cada kernel se asignan a registros. FERMI:

Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse. Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
GPU1 GPU2 GPU3 GPU4

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse. Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
GPU1 GPU2 GPU3 GPU4

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Comunicacin entre procesos distribuidos en los CPUs: Paso de mensajes (MPI)


Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse. Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
GPU1 GPU2 GPU3 GPU4

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Cooperacin entre cores: Memoria compartida o multithreading (OpenMP, pthreads, ..)


Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse. Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.
GPU1 GPU2 GPU3 GPU4

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Computacin en la GPU: Memoria compartida de grano no (OpenCL, CUDA, DirectCompute,CAPS,..)


Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse.
GPU1 GPU2

Multi-GPU
GPU3 GPU4

Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

Computacin en la GPU: Memoria compartida de grano no (OpenCL, CUDA, DirectCompute,CAPS,..)


Friday, October 21, 2011

Aprovechar toda la arquitectura


ii)La computacin paralela lleg para quedarse.
GPU1 GPU2

Programas paralelos hbridos


GPU3 GPU4

Se requiere del desarrollo de algoritmos mixtos para aprovechar la potencia computacional de los nuevos servidores y clusters.

DDR 1 DDR N

Chip set 1

C0 C2 C4 C1 C3 C5

C6 C8 C10 C7 C9 C11

Chip set 2

DDR 1 DDR N

CPU1

CPU2

MPI +

OpenMP pthreads

OpenCL CUDA DirectCompute CAPS

Friday, October 21, 2011

CUDA -- Entorno de desarrollo y lenguaje Extensiones a C


Declspecs
global, device, shared, local, constant
__device__ float filter[N]; __global__ void convolve (float *image) __shared__ float region[M]; ... {

Palabras clave
threadIdx, blockIdx
region[threadIdx.x] = image[i];

Escencial
__syncthreads
__syncthreads() ... image[j] = result; }

Runtime API
Memory, symbol, execution management
// Allocate GPU memory void *myimage = cudaMalloc(bytes)

Funcion de lanzamiento

// 100 blocks, 10 threads per block convolve<<<100, 10>>> (myimage);


75

Friday, October 21, 2011

CUDA -- Entorno de desarrollo y lenguaje Extensiones a C


Cdigo fuente integrado
(foo.cu)

cudacc
EDG C/C++ frontend Open64 Global Optimizer
GPU Assembly
foo.s

CPU Host Code


foo.cpp

OCG G80 SASS


foo.sass

gcc / cl
Mark Murphy, NVIDIAs Experience with Open64, www.capsl.udel.edu/conferences/ open64/2008/Papers/101.doc

76

Friday, October 21, 2011

Compilando un programa CUDA


Aplicacin C/C++ CUDA
float4 me = gx[gtid]; me.x += me.y * me.z;

Parallel Thread eXecution (PTX)


Virtual Machine e ISA Modelo de programacin Ejecucin de recursos y estados

NVCC

cdigo CPU

Virtual Fsica

Cdigo PTX

PTX a un Compilador destino

ld.global.v4.f32 mad.f32

{$f1,$f3,$f5,$f7}, [$r9+0]; $f1, $f5, $f3, $f1;

G80

GPU

Cdigo destino
2877
Friday, October 21, 2011

Compilador CUDA nvcc


Cualquier archivo fuente que contiene extensin CUDA (.cu) se debe compilar con nvcc. El nvcc es un manejador de compilacin (compiler driver) que hace llamdos a las herramientas y compiladores necesarios como: cudacc, g++, cl, ... nvcc produce un archivo de salida que contiene: Cdigo C (cdigo CPU) PTX (Parallel Thread Excecution) o cdigo objeto. Genera cdigo ejecutable para las plataformas como WINDOWS, LINUX o Mac OS X.

Friday, October 21, 2011

Ligado
Cualquier archivo ejecutable con cdigo CUDA requiere dos bibliotecas dinmicas: Biblioteca en tiempo de ejecucin CUDA (cudart). Biblioteca de ncleo CUDA (cuda).

Friday, October 21, 2011

Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE II: PRINCIPIOS Y CONCEPTOS DE PROGRAMACION CUDA

Friday, October 21, 2011

Dispositivos y threads CUDA


Un dispositivo (device) de computadora Es un coprocesador al CPU o host Tiene su propia memoria DRAM (device memory) Ejecuta muchos threads en paralelo Es un tpico GPU pero adems puede ser otro tipo de dispositivo de procesamiento paralelo Partes de cdigo con paralelismo en datos se expresan como un dispositivos kernels en los cuales se ejecutan multiples hilos. Diferencias entre hilos GPU y CPU GPU hilos son extremadamente ligeros Muy poca sobrecarga de creacin GPU requiere miles de threads para una eciencia completa CPU multi-core necesita pocos para una ecienca completa
81
Friday, October 21, 2011

CUDA programacin basada en C


Aplicacion (programa C) integrada al host+device Partes de cdigo C no paralelo o modestamente paralelo corre en el host Partes altamente paralelas en (SPMD kernel C code) device
Serial Code (host) Parallel Kernel (device) KernelA<<< nBlk, nTid >>>(args);

...

Serial Code (host) Parallel Kernel (device) KernelB<<< nBlk, nTid >>>(args);

...
82

Friday, October 21, 2011

G80 en modo CUDA Ejemplo de dispositivo


Procesadores ejecutan hilos Nuevo modo de operacin / interfaz de HW para las computaciones
Host Input Assembler
Thread Execution Manager

Parallel Data Cache Texture Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Parallel Data Cache Texture

Load/store

Load/store

Load/store Global Memory

Load/sto
83

Friday, October 21, 2011

Arreglos de Parallel Threads


Un kernel de CUDA se ejecuta por un arreglo de threads Todos los threads ejecutan el mismo cdigo (SPMD) Cada hilo tiene un ID que usa para el manejo de las direcciones de memoria y para el control de decisin
threadIdx.x
0 1 2 3 4 5 6 7

float x = input[threadIdx.x]; float y = func(x); output[threadIdx.x] = y;

84
Friday, October 21, 2011

Thread Blocks: Cooperacin Escalable


Divide un arreglo monoltico de de hilos Divide en mltiples bloques Threads en un bloque cooperan via memoria compartida, operaciones atmicas y sincronizacin por barreras Threads en bloques distintos no pueden cooperar
Thread Block 0
threadIdx.x
0 1 2 3 4 5 6 7 0

Thread Block 1
1 2 3 4 5 6 7 0

Thread Block N-1


1 2 3 4 5 6 7

float x = input[threadIdx.x]; float y = func(x); output[threadIdx.x] = y;

float x = input[threadIdx.x]; float y = func(x); output[threadIdx.x] = y;

float x = input[threadIdx.x]; float y = func(x); output[threadIdx.x] = y;

85

Friday, October 21, 2011

Identicadores de bloques y de hilos


Cada hilo usa su ID para identicar el dato sobre el cual trabajara Block ID: 1D o 2D Thread ID: 1D, 2D, o 3D

Simplica el direccionamiento de memoria cuando se trabaja con datos multidimensionales Procesamiento de imgenes Resolucin de PDE ....

86
Friday, October 21, 2011

Modelo de memoria CUDA


Memoria global Principalmente es la comunicacin de lectura/escritura entre el host y el device El contenido es visible a todos los hilos Aceso de gran latencia Veremos la memoria global Memoria constante y de texture Host despus....
Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0)

Grid Block (0, 0)


Shared Memory

Block (1, 0)
Shared Memory

Registers

Registers

Registers

Registers

Global Memory

87
Friday, October 21, 2011

Asignacin de memoria al dispositivo CUDA


cudaMalloc() Asigna un objecto de memoria en la Global Memory Usa dos parmetros Direccin del apuntador al objeto asignado Tamao del objeto asignado cudaFree() Libera un objeto de la memoria global (global memory). Apuntador del objeto a liberar
Host
Registers Registers Registers Registers Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0)

Grid Block (0, 0)


Shared Memory

Block (1, 0)
Shared Memory

Global Memory

88
Friday, October 21, 2011

Asignacin de memoria al dispositivo CUDA


Ejemplo: Asignar memoria para un arreglo 64 * 64 de fp-sp Asociar la memoria asignada a Md (frecuentemente d se usa para indicar una estructura para datos en un dispositivo) TILE_WIDTH = 64; Float* Md; // float *Md; int size = TILE_WIDTH * TILE_WIDTH * sizeof(float); cudaMalloc((void**)&Md, size); cudaFree(Md);
89
Friday, October 21, 2011

Transferencia de datos Host-Device en CUDA


cudaMemcpy() transferencia de datos en memoria Requiere de 4 parmetros Apuntador al destino Apuntador fuente Nmero de bytes copiados Tipo de transferencia Host to Host Host to Device Device to Host Device to Device Transferencia sncrona
90
Friday, October 21, 2011

Grid Block (0, 0)


Shared Memory

Block (1, 0)
Shared Memory

Registers

Registers

Registers

Registers

Thread (0, 0)

Thread (1, 0)

Thread (0, 0)

Thread (1, 0)

Host

Global Memory

Transferencia de datos Host-Device en CUDA


Ejemplo Transferir un arreglo de 64 * 64 de fp-sp M esta en la memoria del host y Md en la memoria del dispositivo cudaMemcpyHostToDevice y cudaMemcpyDeviceToHost son constantes simblicas

cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice); cudaMemcpy(M, Md, size, cudaMemcpyDeviceToHost);

91
Friday, October 21, 2011

Revisin de la arquitectura FERMI


512 GPGPUs 16 SM de 32 cores cada uno. 6 particiones de 64 bits cada una. Soporta 6GB de memoria GDDR5 DRAM. Host Interface: conexin entre el CPU y GPU (PCI-Express). GigaThreads despacha los thread blocks a los despachadores de los SMs.

Friday, October 21, 2011

Revisin de la arquitectura FERMI


Jerarqua de memoria

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Friday, October 21, 2011

Revisin de la arquitectura FERMI


Jerarqua de memoria

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Friday, October 21, 2011

Revisin de la arquitectura FERMI


Jerarqua de memoria

Conguracin 1. 48kb de mem. compartida. 16kb de mem. L1 cache.


64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Conguracin 2. 16kb de mem. compartida. 48kb de mem. L1 cache.

Friday, October 21, 2011

Revisin de la arquitectura FERMI

Espacio de direcciones de 40 bits

Friday, October 21, 2011

Revisin de la arquitectura FERMI


Tercera generacin de Streaming-Multiprocessor (SM)
Grupos de 32 threads (internamente les llaman warp o urdimbre). Existen 2 despachadores de hilos. Se expiden 2 instrucciones a la ves a dos hilos diferentes (excepto si la instruccion es double). Cada instruccin se puede ejecutar en 16 cores, 16 LD/ST o en 4 SFU.

Friday, October 21, 2011

Revisin de la arquitectura FERMI

Friday, October 21, 2011

Revisin de la arquitectura FERMI

Tabla de resumen

Friday, October 21, 2011

Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE III - ESTRUCTURA DE LOS PROGRAMAS CUDA

Friday, October 21, 2011

Aspectos relevantes del API de CUDA: Fcil y ligero


El API es una extensin a ANSI C curva de aprendizaje suave

El hardware est diseado para habilitar un runtime y manejador ligero Alto desempeo

101
Friday, October 21, 2011

Estructura de un programa CUDA


programa_generico.cu
// Sentencias del precompilador // Funciones en GPU (kernels) __device__ int funcionK(int a) { int resultado; ... return resultado; } __global__ void kernel1() {...} __global__ void kernel2() {...} // Funcion principal int main(int argc, char **argv) { ... }

#include <stdio.h> #include <stdlib.h> #include <cuda.h> #define N 2000000000000


// Variables globales int vGlobal; __device__ float escalar; // Funciones en CPU void funcion1() { ... } int funcion2(int a, int b) { ... }

Friday, October 21, 2011

Estructura de un programa CUDA


El programa puede estar en varios mdulos: mdulos con cdigo CUDA (.cu) mdulos con cdigo C++ (.cpp) mdulos con cdigo C (.c) Se compilan y ligan con nvcc tal y como si fuera cualquier compilador de C++ o C.

Ejemplo
% nvcc -o ejecu kernels.cu funciones.c main.c -lm -lc

Friday, October 21, 2011

Declaracin de funciones CUDA


Se ejecuta en __device__ float DeviceFunc() __global__ void __host__ KernelFunc() device device host Slo se invoca desde: device host host

float HostFunc()

__global__ dene una funcion kernel Debe regresar void

Friday, October 21, 2011

Estructura de un programa CUDA


programa_generico.cu
// Variables globales int vGlobal; __device__ float escalar; // Funciones en CPU void funcion1() { ...; vGlobal=valor; ... } int funcion2(int a, int b) { ... // llamado a kernel kernel1<<dimGrid,dimBlock>>() ... }
Friday, October 21, 2011

// Funciones en GPU (kernels) __device__ int funcionK(int a) { int resultado; ... return resultado; } __global__ void kernel1() { int a = escalar; } __global__ void kernel2() { ... r = funcionK(threadIdx.x); ... }

Estructura de un programa CUDA


programa_generico.cu
// Variables globales int vGlobal; __device__ float escalar; // Funciones en CPU void funcion1() { ...; vGlobal=valor; ... } int funcion2(int a, int b) { ... // llamado a kernel kernel1<<dimGrid,dimBlock>>() ... }
Friday, October 21, 2011

// Funciones en GPU (kernels) __device__ int funcionK(int a) { int resultado; ... return resultado; } __global__ void kernel1() { int a = escalar; } __global__ void kernel2() { ... r = funcionK(threadIdx.x); ... }

Proceso con cdigo ejecutable cuda


Datos globales y estticos. Memoria dinmica

rea de datos
Cdigo de CPU (funciones)

Cdigo ejecutable.

Cdigo de GPGPU (kernel ... PTX)

rea de cdigo

Datos locales: argumentos y variables denidas en una funcin

rea de pila

107 Friday, October 21, 2011

Declaracin de funciones CUDA


__device__ functions - no se puede tener su direccin de memoria

Para funciones ejecutadas en el device: No recursin No debe haber declaraciones de variables estticas dentro de la funcin No pueden tener un nmero variable de argumentos

Friday, October 21, 2011

Llamado a una funcin de Kernel - Creacin de hilos


Una funcin de kernel debe llamarse con una configuracin de ejecucin:
__global__ void KernelFunc(...); dim3 DimGrid(100, 50); // 5000 thread blocks dim3 DimBlock(4, 8, 8); // 256 threads per block size_t SharedMemBytes = 64; // 64 bytes of shared memory KernelFunc<<< DimGrid, DimBlock, SharedMemBytes >>>(...);

Cualquier llamado a una funcin de kernel function es asncronca desde CUDA 1.0, se requiere de una sncronizacin explcita para el bloqueo.

Friday, October 21, 2011

Programa CUDA
A nivel alto, tenemos un proceso principal el cual se ejecuta en el CPU y ejecuta los siguientes pasos: 1.Inicializa la tarjeta. 2.Asigna memoria en el host y en el device. 3.Copia datos del host al device. 4.Asinga multiples copias de kernels de ejecucin al device. 5.Copia datos de la memoria del device a la memoria del host. 6.Repite pasos 3 a 5 como sea necesario. 7.Libera memoria (del host y device) y termina.

Friday, October 21, 2011

Ejecucin de un proceso CUDA


A nivel bajo, en el GPU: 1.Cada copia de ejecucin de un kernel se ejecuta en un SM. 2.Si el nmero de copias excede el nmero de SM, entonces mas de una copia se ejecutar en un SM si existen recursos disponibles (registros y memoria compartida). 3.Cada hilo en una copia del kernel accesa a su propia memoria compartida, pero y no puede accesar a la memoria compartida de la copia. 4.No hay garantia del orden de ejecucin de las copias del kernel.

Friday, October 21, 2011

Ejecucin de un proceso CUDA


A nivel bajo, en el GPU: 1.Cada copia de ejecucin de un kernel se ejecuta en un SM. 2.Si el nmero de copias excede el nmero de SM, entonces mas de una copia se ejecutar en un SM si existen recursos disponibles (registros y memoria compartida). 3.Cada hilo en una copia del kernel accesa a su propia memoria compartida, pero y no puede accesar a la memoria compartida SM1 SM2 SM3 de la copia. SM4 4.No hay garantia del orden de ejecucin de las copias del kernel.

Friday, October 21, 2011

EJEMPLOS - Mi primer programa CUDA


Recuerde que hay cdigo para el host y cdigo para el device.

primero.cu
int main(int argc, char **argv) { float *h_x, *d_x; // h=host, d=device int nblocks=2, nthreads=8, nsize=2*8;

Cdigo host

h_x = (float *)malloc(nsize*sizeof(float)); cudaMalloc((void **)&d_x,nsize*sizeof(float)); my_first_kernel<<<nblocks,nthreads>>>(d_x); cudaMemcpy(h_x,d_x,nsize*sizeof(float), cudaMemcpyDeviceToHost); for (int n=0; n<nsize; n++) printf(" n, x = %d %f \n",n,h_x[n]); cudaFree(d_x); free(h_x); }
Friday, October 21, 2011

EJEMPLOS - Mi primer programa CUDA


Recuerde que hay cdigo para el host y cdigo para el device.

primero.cu
//#include <cutil_inline.h> __global__ void my_first_kernel(float *x) { int tid = threadIdx.x + blockDim.x*blockIdx.x; x[tid] = threadIdx.x; }

Cdigo kernel

Friday, October 21, 2011

Taller: Introduccin a GPU's y Programacin CUDA para HPC PARTE IV - EJEMPLOS Y EJERCICIOS

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


Una simple ejemplo de multiplicacin de matrices ilustra las caractersticas bsicas de memoria y el manejo de hilos en programas CUDA. Usaremos slo registros. Usaremos el identicador del usuario. Usaremos el API de transferencia de memoria entre host y el device. Por simplicidad, asumiremos que la matriz es cuadrada.

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


C = A * B de tamao n x n
Un thread calcula un elemento de C A y B se cargan n veces desde la memoria global
N B

A
M

C
P
WIDTH

WIDTH

WIDTH

Friday, October 21, 2011

WIDTH

EJEMPLOS - Multiplicacin de matrices


Almacenamiento en la memoria de una matriz, en C.

M0,0 M1,0 M2,0 M3,0 M0,1 M1,1 M2,1 M3,1 M0,2 M1,2 M2,2 M3,2 M0,3 M1,3 M2,3 M3,3

M
M0,0 M1,0 M2,0 M3,0 M0,1 M1,1 M2,1 M3,1 M0,2 M1,2 M2,2 M3,2 M0,3 M1,3 M2,3 M3,3

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


PASO 1: La versin simple en C
// Multiplicacion de matrices en el host (CPU) void MatrixMulOnHost(float *A, float *B, float *C, int n) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { float sum = 0; for (int k = 0; k < n; ++k) { float a = A[i * n + k]; float b = B[k * n + j]; 119 sum += a * b; } M C[i * Width + j] = sum; A } i }

N B

k
WIDTH WIDTH

P C

WIDTH

WIDTH

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


PASO 2: Transferencia de datos de la matriz de entrada
void MatrixMulOnDevice(float *A, float *B, float *C, int n)
{ int size = n*n*sizeof(float);

float *Ad, *Bd, *Cd;


1. // Asigna y carga M, N a la memoria //del dispositivo cudaMalloc(&Ad, size); cudaMemcpy(Ad, A, size, cudaMemcpyHostToDevice); cudaMalloc(&Bd, size); cudaMemcpy(Bd, B, size, cudaMemcpyHostToDevice); // Asigna P en el dispositivo cudaMalloc(&Cd, size);

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


PASO 3: Transferencia de datos de la matriz de salida
void MatrixMulOnDevice(float *A, float *B, float *C, int n)
{ int size = n*n*sizeof(float); 2. // Cdigo de invocacin al Kernel // - se muestra despus 3. // Lee P del dispositivo cudaMemcpy(C, Cd, size, cudaMemcpyDeviceToHost); // Libera las matrices del dispositivo cudaFree(Ad); cudaFree(Bd); cudaFree(Cd); }

float *Ad, *Bd, *Cd;


1. // Asigna y carga M, N a la memoria //del dispositivo cudaMalloc(&Ad, size); cudaMemcpy(Ad, A, size, cudaMemcpyHostToDevice); cudaMalloc(&Bd, size); cudaMemcpy(Bd, B, size, cudaMemcpyHostToDevice); // Asigna P en el dispositivo cudaMalloc(&Cd, size);

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


PASO 4: Funcin del kernel
// kernel de la multiplicacion matricial - por hilo __global__ void MatrixMulKernel(float *A, float *B, float *C, int n) { float tmp=0.0; for (int k=0; k<n; k++) { float Aelement=A[threadIdx.y*n+k]; float Belement=B[k*n+threadIdx.x]; tmp += Aelement*Belement; } C[threadIdx.y*n+threadIdx.x]=tmp; }
Md

Nd B

tx

A ty k
WIDTH

Pd

ty tx
WIDTH

WIDTH

Friday, October 21, 2011

WIDTH

EJEMPLOS - Multiplicacin de matrices


PASO 5: Invocacin del Kernel (del lado del host).

// Se establece la configuracin de ejecucin dim3 dimGrid(1, 1); dim3 dimBlock(n, n);

// Asigna los hilos de ejecucion al dispositivo MatrixMulKernel<<<dimGrid, dimBlock>>>(Ad, Bd, Cd, n);

Friday, October 21, 2011

EJEMPLOS - Multiplicacin de matrices


Slo se usa un bloque de hilos
Slo un bloque de hilos clcula a la matriz Cd:
Cada hilo calcula un elemento de Cd.
Thread )2 ,2(

Grid 1 Block 1

Bd

Cada hilo:
Carga un rengln de la matriz Ad. Carg una columna de la matriz Ad. Realiza una multiplicacin y una suma por cada par de elementos de Ad y Bd.

48

Tamao de la matriz est limitado por el nmero de hilos permitidos en un bloque.

WIDTH

Ad

Cd

Friday, October 21, 2011

Midiendo el tiempo de ejecucin


Uso de eventos. Se ejecutan desde el host

// 1. Crea e inicializa las estructuras // de eventos cuda cudaEvent_t start, stop;

cudaEventCreate(&start); cudaEventCreate(&stop);
// 2. Registra el evento inicial cudaEventRecord(start, 0); // 3. Ejecutar funciones de cuda // (asignar memoria, copiar datos, // llamar kernels, ... )

Friday, October 21, 2011

Midiendo el tiempo de ejecucin


Uso de eventos. Se ejecutan desde el host
// 4. Registra el evento final cudaEventRecord(stop, 0); cudaEventSynchronize(stop); // 5. Calcular y desplegar el tiempo // de ejecucion float elapsedTime;

// 1. Crea e inicializa las estructuras // de eventos cuda cudaEvent_t start, stop;

cudaEventCreate(&start); cudaEventCreate(&stop);
// 2. Registra el evento inicial cudaEventRecord(start, 0); // 3. Ejecutar funciones de cuda // (asignar memoria, copiar datos, // llamar kernels, ... )

cudaEventElapsedTime(&elapsedTime, start, stop); printf(Tiempo %4.6f en milseg\n, elapsedTime);


// 6. Dar de baja eventos cuda cudaEventDestroy(start); cudaEventDestroy(stop);

Friday, October 21, 2011

Ejercicios propuestos para el taller


Suma de vectores (y matrices). Multiplicacin de un escalar por una matriz. Mtodo Gauss-Jordan para resolver un sistema de ecuaciones y para obtener la inversa de una matriz.

Friday, October 21, 2011

TALLER CUDA PARTE V - COOPERACION ENTRE HILOS

Friday, October 21, 2011

Ejecucin de hilos
#include <stdio.h> #define N (33 * 1024) __global__ void add( int *a, int *b, int *c ) { int tid = threadIdx.x + blockIdx.x * blockDim.x; while (tid < N) { c[tid] = a[tid] + b[tid]; tid += blockDim.x * gridDim.x; } }

Friday, October 21, 2011

Ejecucin de hilos
N esta definido por la cantidad 33792

add<<<128,128>>>(dev_a, dev_b, dev_c); Total de hilos 16384 (33792/16384) = 2.0625

add<<< 64,128>>>(dev_a, dev_b, dev_c); Total de hilos 8192 (33792/8192) = 4.125

Friday, October 21, 2011

Ejecucin de hilos

SM1

SM2

SM3

SM4

Friday, October 21, 2011

Ejecucin de hilos

SM1

SM2

SM3

SM4

Friday, October 21, 2011

Recordando la arquitectura FERMI


Jerarqua de memoria

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Friday, October 21, 2011

Manejo de cache Kernel alineado

Kernel disperso

Friday, October 21, 2011

Variables globales
Variables que son visibles desde distintos kernels.

Variables en la memoria del device, no en el host. Cualquier kernel puede hacer operaciones de Lectura/Escritura. Se pueden declarar arreglos de tamao jo.

Friday, October 21, 2011

Variables constantes
Constantes que son visibles desde distintos kernels.

__constant__ oat a[1024];

Se inicializan desde el host con la funcin cudaMemcpyToSymbol Cualquier kernel puede hacer operaciones de Lectura. Se pueden declarar arreglos de tamao jo.

Friday, October 21, 2011

Constantes
Una constante es una variable cuyo valor se pone en tiempo de ejecucin. Existen valores que se ponen en tiempo de compilacin #define PI 3.1415936f a = b * 2.0f / PI; Estos valores se guardan en el rea de cdigo, no ocupan registro pues vienen en el ujo de instrucciones.

Friday, October 21, 2011

Registros
Por omisin, variables locales de cada kernel se asignan a registros. FERMI:

Friday, October 21, 2011

Registros
Por omisin, variables locales de cada kernel se asignan a registros. TESLA:

Friday, October 21, 2011

Registros

Friday, October 21, 2011

Registros El compilador transforma el vector a valores escalares

Friday, October 21, 2011

Memoria compartida
Variables visibles por todos los hilos de un bloque. Se declaran dentro de un kernel.

Puede ser una alternativa al uso de arreglos locales. Reduce el uso de registros cuando una variable tiene el mismo valor en todos los threads.

Friday, October 21, 2011

Recordando la arquitectura FERMI


Jerarqua de memoria

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

64 KB

768 KB
64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB 64 KB

Friday, October 21, 2011

Reduccin

Operacin producto interior


N 1

< u, v >=
i=0

u[ i ] v [ i ]

Cada hilo hace una parte de la operacin total y al nal se suman los resultados parciales. En cuda podemos ver resultados parciales por hilo y por bloque.

Friday, October 21, 2011

Reduccin

Vector U Vector V

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque 1

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque 1 2

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque 1 2 3

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque 1 2 3 4

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2 3

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2 3

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2 3

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2 3

Friday, October 21, 2011

Reduccin

Vector U Vector V Bloque Bloque Bloque Bloque Bloque Bloque Bloque 1 2 3 4 1 2 3

Friday, October 21, 2011

Reduccin
// Producto Punto const int N = 33*1024; const int threadsPerBlock = 256; const int blocksPerGrid = 32; __global__ void dot(float *a, float *b, float *c) { __shared__ float cache[threadsPerBlock]; int tid = threadIdx.x + blockIdx.x * blockDim.x; int cacheIndex = threadIdx.x; float temp = 0; while (tid < N) { temp += a[tid] * b[tid]; tid += blockDim.x * gridDim.x; } cache[cacheIndex] = temp; __syncthreads(); int i = blockDim.x/2; while (i != 0) { if (cacheIndex < i) cache[cacheIndex] += cache [cacheIndex + i]; __syncthreads(); i /= 2; } if (cacheIndex == 0) { c[blockIdx.x] = cache[0]; } }

Friday, October 21, 2011

Reduccin

Friday, October 21, 2011

Bibiografa
J. Sanders & E. Kandrot; CUDA by Example: An Introduction to General-Purpose GPU Programming; Addison-Wesley Professional, 2010. NVIDIA Corporation ; NVIDIA CUDA C, Programming Guide, Version 3.2, Septiembre 2010. NVIDIA Corporation ; NVIDIA CUDA, CUDA C Best Practices Guide, Version 3.2, Agosto 2010. NVIDIA Corporation ; The CUDA Compiler Driver NVCC; Agosto 2010. NVIDIA Corporation; NVIDIA CUDA, Reference Manual, Version 3.2 Beta, Agosto 2010.
159
Friday, October 21, 2011

Bibiografa
D. Kirk & Wen-Mei W. Hwu; Programming Massively Parallel Processors: A Hands-on Approach; Morgan Kaufmann, 2010. Mike Giles; Course on CUDA Programming on NVIDIA GPUs, July 2010. NVIDIA Corporation; CUDA Presentation 4.0; 2011. Michael J. Quinn; Parallel Programming in C with MPI and OpenMP; McGrawHill, International Edition, 2003. Jack Dongara, et. al.; Sourcebook of Parallel Computing, Morgan Kaufmann Ed.; 2003.

160
Friday, October 21, 2011

Bibiografa
Jack Dongara, et. al.; Sourcebook of Parallel Computing, Morgan Kaufmann Ed.; 2003. T.G. Mattson, B.A. Sanders, B.L. Massingill; Patterns For Parallel Programming; Addison Wesley, 2007. G.E. Karniadakis, R.M. Kirby II; Parallel Scientic Computing in C ++ and MPI; 2nd edition, Cambridge University Press, 2005.

161
Friday, October 21, 2011

Вам также может понравиться