Articulo de cuda

2
26 Al desarrollar videojuegos lo más común es utilizar motores que nos proveen frameworks y APIs que facilitan la interacción con la tarjeta de video para el rendering de gráficos, y por lo tanto no es necesario que programemos directamente para el GPU. Sin embargo, como buen lector de SG, tal vez ten- gas curiosidad de saber cómo podrías programar di- rectamente hacia el GPU. Esto te permitiría crear por ejemplo un motor de gráficos de muy alto desempeño. Más allá del rendering de gráficos, el pro- cesamiento paralelo con GPU puede aplicarse para resolver todo tipo de problemas de cóm- puto. A fin de cuentas, al igual que un CPU, un GPU es una unidad de procesamiento que recibe datos e instrucciones y las procesa. La diferencia es que la arquitectura de un GPU se presta mucho más al procesamiento para- lelo que la de un CPU tradicional. Mientras que un CPU está formado por algunos cuantos núcleos (cores ) con mucha memoria cache que pueden manejar unos cuantos hilos (threads ) al mismo tiempo, un GPU típicamente está compuesto por cientos de núcleos de procesa- miento que pueden manejar miles de hilos de manera simultánea. Gracias a esto, el procesa- miento paralelo de datos usando GPUs llega a ser mucho más rápido, económico y con me- nos gasto de energía que si usaramos CPUs. Es así que el cómputo por GPU ya se aplica en algunas organizaciones para acelerar cargas de procesamiento en áreas tales como el modelado financiero, investigación científica y explora- ción de gas y petróleo. En este artículo veremos a grandes rasgos cómo construir programas que interactúen di- rectamente con el GPU. Para ello utilizaremos CUDA (Compute Unified Device Architectu- re), que es una tecnología que incorporan las tarjetas de video N-Vidia. CUDA ofrece un API en C, que es el que usaremos. Vale la pena notar que CUDA no es la única opción para progra- mar hacia el GPU, existen otras como OpenCL y DirectCompute. FUNCIONAMIENTO DE CUDA En la Figura 1 podemos ver cómo está organizado internamente un proceso en CUDA en base a los elementos: kernel, grid, block y thread. Un kernel es una función que al ejecutar- se lo hará en N distintos hilos en lugar de en forma secuencial. La ejecución de un kernel en múltiples threads (hilos) es organizada “espa- cial y temporalmente” como un grid (malla) de bloques de threads. Esta organización tiene que ver con la estructura en multiprocesado- res del array de procesadores. Cada bloque es Las Unidades de Procesamiento Grafico (GPUs) incluidas en las tarjetas de video modernas son procesadores de varios núcleos cuyo principal objetivo es realizar cálculos para el rendering de grá- ficas 3D en tiempo real. PROGRAMANDO PARA EL GPU CON CUDA ›› Por Hector Cuesta Arvizu y Jorge Esteban Zaragoza .BIO Héctor Cuesta Arvizu (@hm- cuesta) es Lic. en Informática y actualmente cursa la maestría en ciencias de la computación en la UAEM Texcoco. Adicionalmente se desempeña como instructor de TI para Nyce en el área de base de datos e ingeniería de software. Jorge Esteban Zaragoza Salazar (@TheSuperJez) es Ingeniero en Sistemas Computacionales. Es apasionado del desarrollo de software y se especializa en el desarrollado de aplicaciones Web de alto rendimiento.

Transcript of Articulo de cuda

Page 1: Articulo de cuda

26

Al desarrollar videojuegos lo más común es utilizar

motores que nos proveen frameworks y APIs que

facilitan la interacción con la tarjeta de video para el

rendering de gráficos, y por lo tanto no es necesario

que programemos directamente para el GPU.

Sin embargo, como buen lector de SG, tal vez ten-

gas curiosidad de saber cómo podrías programar di-

rectamente hacia el GPU. Esto te permitiría crear por

ejemplo un motor de gráficos de muy alto desempeño.

Más allá del rendering de gráficos, el pro-

cesamiento paralelo con GPU puede aplicarse

para resolver todo tipo de problemas de cóm-

puto. A fin de cuentas, al igual que un CPU,

un GPU es una unidad de procesamiento que

recibe datos e instrucciones y las procesa. La

diferencia es que la arquitectura de un GPU

se presta mucho más al procesamiento para-

lelo que la de un CPU tradicional. Mientras

que un CPU está formado por algunos cuantos

núcleos (cores) con mucha memoria cache que

pueden manejar unos cuantos hilos (threads)

al mismo tiempo, un GPU típicamente está

compuesto por cientos de núcleos de procesa-

miento que pueden manejar miles de hilos de

manera simultánea. Gracias a esto, el procesa-

miento paralelo de datos usando GPUs llega a

ser mucho más rápido, económico y con me-

nos gasto de energía que si usaramos CPUs. Es

así que el cómputo por GPU ya se aplica en

algunas organizaciones para acelerar cargas de

procesamiento en áreas tales como el modelado

financiero, investigación científica y explora-

ción de gas y petróleo.

En este artículo veremos a grandes rasgos

cómo construir programas que interactúen di-

rectamente con el GPU. Para ello utilizaremos

CUDA (Compute Unified Device Architectu-

re), que es una tecnología que incorporan las

tarjetas de video N-Vidia. CUDA ofrece un API

en C, que es el que usaremos. Vale la pena notar

que CUDA no es la única opción para progra-

mar hacia el GPU, existen otras como OpenCL

y DirectCompute.

FUNCIONAMIENTO DE CUDAEn la Figura 1 podemos ver cómo está organizado

internamente un proceso en CUDA en base a los

elementos: kernel, grid, block y thread.

Un kernel es una función que al ejecutar-

se lo hará en N distintos hilos en lugar de en

forma secuencial. La ejecución de un kernel en

múltiples threads (hilos) es organizada “espa-

cial y temporalmente” como un grid (malla)

de bloques de threads. Esta organización tiene

que ver con la estructura en multiprocesado-

res del array de procesadores. Cada bloque es

Las Unidades de Procesamiento Grafico (GPUs) incluidas en las tarjetas de video modernas son procesadores de varios núcleos cuyo principal objetivo es realizar cálculos para el rendering de grá-ficas 3D en tiempo real.

PROGRAMANDO PARAEL GPU CON CUDA›› Por Hector Cuesta Arvizu y Jorge Esteban Zaragoza

.BIO

Héctor Cuesta Arvizu (@hm-

cuesta) es Lic. en Informática y

actualmente cursa la maestría en

ciencias de la computación en la

UAEM Texcoco. Adicionalmente se

desempeña como instructor de TI

para Nyce en el área de base de

datos e ingeniería de software.

Jorge Esteban Zaragoza Salazar

(@TheSuperJez) es Ingeniero

en Sistemas Computacionales.

Es apasionado del desarrollo de

software y se especializa en el

desarrollado de aplicaciones Web

de alto rendimiento.

Page 2: Articulo de cuda

ww

w.s

g.c

om

.mx

|

So

ftw

are

Gu

ru

27

PRINCIPAL

PROGRAMANDO PARA

EL GPU CON CUDA

atendido por un multiprocesador, así que to-

dos los threads de un bloque son ejecutados

en el mismo multiprocesador. Gracias a esto,

los threads de un mismo bloque pueden sin-

cronizar su ejecución y compartir datos de

forma eficiente usando memoria local de baja

latencia. En cambio, los threads de bloques

distintos no pueden cooperar (o al menos no

es trivial lograrlo).

INSTALACIÓN DE LAS HERRAMIENTASPara usar CUDA debes descargar e instalar:

los drivers para la tarjeta de video (tu tarjeta

debe soportar CUDA), el toolkit de CUDA

que contiene los elementos necesarios para po-

der compilar, y el GPU Computing SDK que

contiene proyectos de ejemplo. Todo esto está

disponible para plataformas Windows, Linux y

Mac, y se puede descargar en http://developer.

nvidia.com/cuda-downloads

Ejemplo de Algoritmo Paralelizado

El listado 1 muestra un código de tipo “Hola

Mundo” usando CUDA en C

#include “cuPrintf.cu”

#include <cuda.h>

#include <stdio.h>

// funcion kernel para mostrar thread ID

__global__ void ejemploImprime() {

int idx = blockDim.x*blockIdx.x + threadIdx.x

cuPrintf(“Hola mundo, %d \n”, idx);

}

int main() {

cudaPrintfInit();

// invocamos función kernel con 5 grids y 2 bloques.

ejemploImprime<<<5,2>>>();

//Mostrar el saludo del kernel

cudaPrintfDisplay();

cudaPrintfEnd();

return 0;

}

Listado 1. Hola Mundo usando CUDA

Al ejecutar el código del listado 1 obtendre-

mos un resultado como el de la figura 2.

CONCLUSIÓNEn este artículo echamos un vistazo a cómo hacer

programación para GPU con CUDA. Si te intere-

sa desarrollar soluciones que puedan analizar can-

tidades masivas de datos en un tiempo razonable y

con un costo de hardware relativamente bajo, una

excelente opción es hacer un cluster de supercóm-

puto utilizando GPUs de consolas de videojuego.

Debemos tener en cuenta que no todo es pa-

ralelizable, por lo que durante el diseño de nues-

tro software debemos identificar qué partes de

nuestro algoritmo vamos a optimizar, así como

organizar la memoria de tal forma que los accesos

paralelos sean óptimos y con esto evitar cuellos

de botella (race condition).

Figura 1. Arquitectura CUDA

Figura 2. Ejecución de Hola Mundo CUDA

Referencias

[1] NVIDIA Developer Zone.

http://developer.nvidia.com

[2] http://forums.nvidia.com/index.

php?showtopic=106638

[3] Kirk D.B., Hwu W., ”Programing

massively parallel processors”,

Elsevier, 2010.