8
70 http://www.linuxmagazine.com.br PROGRAMAÇÃO Use sua GPU para agilizar os cálculos A GPU que calculava As GPUs modernas são capazes de realizar diversos cálculos de ponto flutuante ao mesmo tempo. Explore essa capacidade em favor do processamento numérico. por Alessandro de Oliveira Faria (Cabelo) O uso orquestrado das GPUs (unidades de processamento gráfico, o processador das placas de vídeo) e CPUs mudará o rumo da computação. Trabalhos que levam dias para serem processados poderão reduzir esse tempo para ho- ras. Protetores de tela que trabalham em cluster utilizando a GPU permi- tirão acelerar trabalhos de pesquisas para o desenvolvimento da cura de doenças letais. Este artigo mostrará como utilizar recursos da GPU com a tecnologia NVIDIA CUDA. A edição 61 da Linux Magazine contém um artigo sobre visão compu- tacional [1] que menciona a aplica- bilidade dessa tecnologia em projetos de realidade aumentada, robótica e biometria que utilizam reconheci- mento de padrões e processamento de imagens em tempo real. Aplicar processos de visão com- putacional em fluxos de vídeo ao vivo é uma tarefa morosa devido ao grande consumo de processamen- to matemático. Esse custo compu- tacional é alto até mesmo para os processadores atuais, pois analisar e processar imagens ao vivo significa aplicar complexos algoritmos em 30 com dimensões de 640x480 pixels por segundo. Neste cenário, os chips grá- ficos serão imprescindíveis para um ganho significativo de desempenho nessas aplicações. CPU x GPU Vale a pena mencionar que, em teoria, quanto mais núcleos tem uma CPU, maior o número de transístores e, por consequência, John evans – sxc.hu

por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

Embed Size (px)

Citation preview

Page 1: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

70

CUDA

http://www.linuxmagazine.com.br

CUDAP

RO

GR

AM

ÃO Use sua GPU para agilizar os cálculos

A GPU que calculavaAs GPUs modernas são capazes de realizar diversos cálculos de ponto flutuante ao mesmo tempo. Explore essa capacidade em favor do processamento numérico.por Alessandro de Oliveira Faria (Cabelo)

O uso orquestrado das GPUs (unidades de processamento gráfico, o processador das

placas de vídeo) e CPUs mudará o rumo da computação. Trabalhos que levam dias para serem processados poderão reduzir esse tempo para ho-ras. Protetores de tela que trabalham em cluster utilizando a GPU permi-tirão acelerar trabalhos de pesquisas para o desenvolvimento da cura de doenças letais. Este artigo mostrará como utilizar recursos da GPU com a tecnologia NVIDIA CUDA.

A edição 61 da Linux Magazine contém um artigo sobre visão compu-tacional [1] que menciona a aplica-bilidade dessa tecnologia em projetos de realidade aumentada, robótica e biometria que utilizam reconheci-mento de padrões e processamento de imagens em tempo real.

Aplicar processos de visão com-putacional em fluxos de vídeo ao vivo é uma tarefa morosa devido ao grande consumo de processamen-to matemático. Esse custo compu-tacional é alto até mesmo para os

processadores atuais, pois analisar e processar imagens ao vivo significa aplicar complexos algoritmos em 30 com dimensões de 640x480 pixels por segundo. Neste cenário, os chips grá-ficos serão imprescindíveis para um ganho significativo de desempenho nessas aplicações.

CPU x GPUVale a pena mencionar que, em teoria, quanto mais núcleos tem uma CPU, maior o número de transístores e, por consequência,

John

eva

ns –

sxc

.hu

Page 2: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

CUDA

71

| PROGRAMAÇÃOCUDA

Linux Magazine #64 | Março de 2010

melhor o desempenho. Contudo, na prática, isso não acontece por um motivo principal: o software está anos atrás do hardware. Uma CPU com quatro núcleos pode perder em termos de desempenho nos jogos pelo fato do software ser otimizado para dois núcleos. A programação paralela para quatro núcleos significa aumentar o pro-blema, sem contar a otimização dos compiladores para fazer uso do paralelismo.

Assim, entendemos a recente aquisição de um supercomputador baseado em GPUs pela Petrobras [2]. O seu poder de processamento é de 250 Teraflops, caracterizando-o como 16º maior supercomputador do planeta.

Para entender melhor a diferença fundamental entre os processadores convencionais (CPUs) e os chips de vídeo (GPUs), é importante saber que as CPUs são otimizadas para cálculos sequenciais, enquanto que as GPUs são otimizadas para cálculos intensamente paralelos.

CUDAA tecnologia NVIDIA CUDA é uma arquitetura de computação paralela cujo objetivo principal é tirar proveito máximo da computação paralela das GPUs NVIDIA, com a finalidade de resolver problemas computacionais complexos em uma fração do tem-po gasto por uma CPU. A seguir, os principais recursos da tecnologia: linguagem C padrão para de-

senvolvimento de aplicativos em paralelo na GPU;

lbibliotecas numéricas padrão para FFT e BLAS;

ltransferência rápida de dados entre a GPU e a CPU;

linteroperação do driver CUDA com os drivers gráficos OpenGL e DirectX;

lsuporte a sistemas operacionais Linux de 32 e 64 bits e Windows XP de 32 e 64 bits.

No passado, era muito clara essa diferença entres os chips, pois as placas 3D processavam muitos tri-ângulos por segundo (como a 3dfx Voodoo, por exemplo). Porém, com o surgimento dos shaders (rotinas criadas para tarefas específicas na criação de cenas), as GPUs passa-ram a ganhar capacidade de pro-cessamento sequencial como as CPUs. Os shaders permitem pro-cedimentos de sombreamento e iluminação, dando assim liberdade

aos programadores artistas. O ter-mo “shader” é originado programa RenderMan, criado pela Pixar no final da década de 80.

Uma placa de vídeo GeForce 9600 GT apresenta desempenho fantástico quando comparada a um processador Intel Core 2 Duo E6700 na tarefa de codificação de vídeos H.264. Nos testes realizados para este artigo, um trailer na resolução de 1920x1080 pixels levou aproxima-damente 3:36 minutos para ser co-

Listagem 1: Instalação do pacote CUDA Toolkit

# sh cudatoolkit_2.3_linux_64_suse11.1.runUncompressing NVIDIA CUDA.......................................................................................................................................................................................................................Enter install path (default /usr/local/cuda, ‘/cuda’ will be appended): “man/man3/cudaBindTexture.3” -> “/usr/local/cuda/man/man3/cudaBindTexture.3”

“man/man3/cuMemsetD2D32.3” -> “/usr/local/cuda/man/man3/cuMemsetD2D32.3”

“man/man3/NumChannels.3” -> “/usr/local/cuda/man/man3/NumChannels.3”“man/man3/cudaD3D9ResourceSetMapFlags.3” -> “/usr/local/cuda/man/man3/cudaD3D9ResourceSetMapFlags.3”“man/man3/CUDA_ERROR_INVALID_HANDLE.3” -> “/usr/local/cuda/man/man3/CUDA_ERROR_INVALID_HANDLE.3”

“man/man3/cudaDeviceProp.3” -> “/usr/local/cuda/man/man3/cudaDeviceProp.3”

“man/man3/CU_MEMHOSTALLOC_PORTABLE.3” -> “/usr/local/cuda/man/man3/CU_MEMHOSTALLOC_PORTABLE.3”

======================================== * Please make sure your PATH includes /usr/local/cuda/bin* Please make sure your LD_LIBRARY_PATH* for 32-bit Linux distributions includes /usr/local/cuda/lib* for 64-bit Linux distributions includes /usr/local/cuda/lib64* OR* for 32-bit Linux distributions add /usr/local/cuda/lib* for 64-bit Linux distributions add /usr/local/cuda/lib64* to /etc/ld.so.conf and run ldconfig as root * Please read the release notes in /usr/local/cuda/doc/ * To uninstall CUDA, delete /usr/local/cuda* Installation Complete

Page 3: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

72

CUDA

http://www.linuxmagazine.com.br

PROGRAMAÇÃO | CUDA CUDACUDA

dificado pela GPU; já a codificação por processos convencionais (isto é, CPUs) levou em torno de 17:17 minutos. Logo, é possível utilizar a tecnologia NVIDIA CUDA para codificar e decodificar vídeos, como também em aplicações científicas de alta performance.

A CUDA permite empregar re-cursos das placas NVIDIA utilizan-do chamadas em C (C for CUDA, compilador nvcc), o que é um pro-cesso relativamente fácil para os bons programadores. Também existem abs-trações de CUDA para a linguagem

Java (jCUDA), C# (CUDA.NET) e também Python (PyCUDA).

OpenCLO OpenCL pode ser entendido como “parente” do OpenGL. Desenvolvi-do pelo Khronos Group, associação de fabricantes dedicada à criação de padrões abertos, o OpenCL permite não somente o uso de GPUs, como também o acesso aos chips acelera-dores (processadores Cell). Isto de-monstra a flexibilidade do projeto.

Embora pareça lógica a escolha da tecnologia OpenCL em virtu-

de de sua compatibilidade com as GPUs, a prática retrata um cenário um pouco diferente. O OpenCL proporciona funções específicas para cada fámilia de GPUs. Com isso, o desenvolvimento de soluções e aplicativos genéricos implica abs-trair algumas funções em virtude do hardware em questão.

Está muito claro que os benefícios dessa tecnologia são enormes. No en-tanto, as dificuldades são ainda maio-res, pois o desenvolvimento paralelo exige aplicar nova metodologia de desenvolvimento. Poucos aplicativos são capazes de explorar tecnologias com quatro núcleos; imagine então como utilizar os recursos de hard-wares de 5.000 núcleos.

O processamento paralelo pela GPU executa mais ações com me-nos tráfego de informações em bar-ramentos, usando a área de cache comum e acesso direto a memória. Com a utilização da API (OpenMM), será possível desenvolver cálculos moleculares de maneira simples e integrada com as GPUs. Logo, o trabalho que uma CPU processa em dias será processado em horas.

Os especialistas no segmento di-zem que, no futuro, os processadores terão uma unidade de processamento paralelo integrada, executando assim múltiplas funções. Então, é possível acreditar que a GPU será mais um processador auxiliar, como aconteceu com o co-processador matemático integrado nos processadores 486. Na geração dos processadores 386, era preciso usar co-processadores mate-máticos externos à CPU.

Download e instalaçãoOs arquivos necessários para se traba-lhar com a tecnologia CUDA devem ser obtidos no site da NVIDIA [3].

O arquivo cudatoolkit_2.3_li-nux_64_suse11.1.run contém as ferra-mentas de desenvolvimento (com-pilador, entre outros). Já o arquivo cudasdk_2.3_linux.run, como o próprio

Listagem 2: Instalação do pacote CUDA SDK

$ sh cudasdk_2.3_linux.runVerifying archive integrity... All good.Uncompressing NVIDIA GPU Computing SDK........................................................................................................................................................................................... Enter install path (default ~/NVIDIA_GPU_Computing_SDK): which: no nvcc in (/usr/lib64/mpi/gcc/openmpi/bin:/home/cabelo/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin)

Could not locate CUDA. Enter the full path to CUDA.If you do not know the path, accept the default and thenmodify the CUDA_INSTALL_PATH variable in/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/common.mk. “sdk/shared/inc/stopwatch_base.inl” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/inc/stopwatch_base.inl”

“sdk/shared/inc/nvShaderUtils.h” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/inc/nvShaderUtils.h”

“sdk/shared/inc/stopwatch.h” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/inc/stopwatch.h”

“sdk/shared/inc/cudpp” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/inc/cudpp”

“sdk/shared/inc/cudpp/cudpp.h” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/inc/cudpp/cudpp.h”

“sdk/shared/Makefile” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/Makefile”

========================================Configuring SDK Makefile (/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/common.mk)...

Page 4: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

CUDACUDA

73

| PROGRAMAÇÃOCUDA

Linux Magazine #64 | Março de 2010

CUDA

nome diz, são os arquivos de desen-volvimento com exemplos.

Atenção: este artigo parte do princípio de que o equipamento possui instalado o driver NVIDIA versão 190 ou superior, com supor-te a CUDA.

Para instalar o pacote CUDA Toolkit, execute o arquivo cudato-olkit_2.3_linux_64_suse11.1.run, cuja saída é ilustrada na listagem 1.

Em seguida, insira a linha a se-guir no arquivo /etc/ld.so.conf ou acrescente esse caminho à variável de ambiente LD_LIBRARY_PATH:

/usr/local/cuda/lib64

Além disso, é preciso incluir o di-retório bin/ na váriavel PATH:

export \PATH=“$PATH:/usr/local/cuda/bin”

Repita o procedimento para ins-talar o pacote CUDA SDK, execu-tando o arquivo cudasdk_2.3_linux.run (listagem 2).

É importante fazer uma ressal-va neste ponto: para as versões 4.3 e posteriores do compilador GCC

Listagem 3: Teste da SDK CUDA

cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release $ ./deviceQueryCUDA Device Query (Runtime API) version (CUDART static linking)There is 1 device supporting CUDA Device 0: “GeForce 8400M GS” CUDA Driver Version: 2.30 CUDA Runtime Version: 2.30 CUDA Capability Major revision number: 1 CUDA Capability Minor revision number: 1 Total amount of global memory: 268107776 bytes Number of multiprocessors: 2 Number of cores: 16 Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 16384 bytes Total number of registers available per block: 8192 Warp size: 32 Maximum number of threads per block: 512 Maximum sizes of each dimension of a block: 512 x 512 x 64 Maximum sizes of each dimension of a grid: 65535 x 65535 x 1 Maximum memory pitch: 262144 bytes Texture alignment: 256 bytes Clock rate: 0.80 GHz Concurrent copy and execution: Yes Run time limit on kernels: Yes Integrated: No Support host page-locked memory mapping: No Compute mode: Default (multiple host threads can use this device simultaneously)

Test PASSED Press ENTER to exit...

11 4

082-

1300

SEJA

UM

BOM

GES

TOR

E UT

ILIZ

E AS

M

ELHO

RES

PRÁT

ICAS

ADO

TADA

S E

RECO

MEN

DADA

S PE

LOS

PROF

ISSI

ONAI

S M

AIS

EXPE

RIEN

TES

NESS

A ÁR

EA p.

36

#44

07/0

8 R

$ 13

,90

7,

50 7 908179 640029

4 4 0 0 0

A R

EV

ISTA

DO

PR

OFI

SS

ION

AL

DE

TI

WW

W.L

INU

XM

AG

AZI

NE

.CO

M.B

R

CASE

ALF

RESC

O p

.26

A Co

nstr

ucap

agi

lizou

seu

s pr

ojet

os c

om o

Alfr

esco

LIN

UX P

ARK

2008

p.2

8In

icia

da e

m P

orto

Ale

gre

a te

mpo

rada

de

sem

inár

ios

Linu

x Pa

rk d

e 20

08CE

ZAR

TAUR

ION

p.3

4O

Códi

go A

bert

o co

mo

ince

ntiv

o à

inov

ação

GOVE

RNAN

ÇA C

OM

» O

que

dize

m o

s pr

ofiss

iona

is

cert

ifica

dos

p.24

» Co

bit,

CMM

I, IT

IL. Q

uais

as

mel

hore

s pr

átic

as?

p.36

» IT

IL n

a pr

átic

a p.

39»

Nov

idad

es d

o IT

IL v

3. p

.44

SEGU

RAN

ÇA: D

NSS

EC p.

69Co

m o

DN

SSEC

, a re

solu

ção

de n

omes

fica

pro

tegi

da

de a

taqu

es. M

as s

eupr

eço

vale

a p

ena?

REDE

S: IP

V6 p.

64Co

nheç

a as

van

tage

ns d

a no

va v

ersã

o do

Inte

rnet

Pr

otoc

ol, e

vej

a po

r que

é di

fícil

adot

á-la

VEJA

TAM

BÉM

NES

TA E

DIÇÃ

O:»

Rela

tóri

os d

o Sq

uid

com

o S

ARG

p.60

» Ja

va, R

uby

e Ra

ils: c

onhe

ça o

JRu

by o

n Ra

ils p

.74

» Be

nchm

arks

do

GCC

4.3?

p.5

Beca

pe d

e ba

ncos

de

dado

s co

m a

Lib

ferr

is p

.46

» LP

I nív

el 2

: Ser

vido

res

NIS

e D

HCP

p.52

A R

EV

ISTA

DO

PR

OFI

SS

ION

AL

DE

TI

Linux Magazine # 63

02/2010

WW

W.L

INU

XM

AG

AZI

NE

.CO

M.B

R

# 63

F

eve

reir

o

2010

» St

orag

e co

mpl

eto:

Fre

eNAS

p.3

Rede

sad

ia c

om tr

affic

sha

ping

p.3

Sudo

: pro

blem

a ou

sol

ução

? p.

40»

Fcro

n, u

m C

ron

bem

mel

hor p

.44

LINU

X NA

CÂM

ARA

p.24

No

va m

igra

ção

par

a S

oft

war

e

Livr

e n

a C

âmar

a d

e C

amp

inas

CLOU

D CO

MPU

TING

E O

PEN

SOUR

CE p

.30

Ce

zar

Tau

rio

n li

sta

as in

icia

tiva

s ab

ert

as p

ara

com

pu

taçã

o e

m n

uve

m

SUPO

RTE

LOCA

L p.

28M

add

og

ex

pli

ca p

or

qu

e o

su

po

rte

loca

l é e

sse

nci

al

SEGU

RANÇ

A: C

RIPT

OGRA

FIA

p.70

No

segu

ndo

artig

o da

sér

ie, c

onhe

ça e

xem

plos

de

bom

e m

au u

sos

da c

ript

ogra

fia.

REDE

S: A

PACH

E +

SELI

NUX

p.64

Velo

cida

de o

u se

gura

nça?

Esc

olha

os

dois

co

m o

mód

ulo

mod

_sel

inux

do

Apac

he.

VEJA

TAM

BÉM

NES

TA E

DIÇÃ

O:»

Open

Sola

ris, p

arte

10:

Bac

kup

e re

stau

raçã

o em

UFS

p.5

4

» GP

S ra

stre

ado

com

o O

penG

TS p

.50

» N

ovo

edito

r XM

L liv

re: S

ynte

xt S

erna

p.4

Alta

dis

poni

bilid

ade

sobr

e Op

enSo

lari

s p.

58

SYSADMIN  FREENAS  WONDERSHAPER  SUDO  FCRON  CRIPTOGRAFIA  MOD_SELINUX  OPENSOLARIS  OPENGTS  SERNA  ALTA DISPONIBILIDADE

PROG

RAM

AS, F

ERRA

MEN

TAS

E TÉ

CNIC

AS P

ARA

VOCÊ

GAR

ANTI

R A

SUA

TRAN

QUIL

IDAD

E E

O FU

NCIO

NAM

ENTO

PER

FEIT

O DO

S SI

STEM

AS p

. 31

SYSA

DMIN

exemplar deAssinante venda proibida

» St

orag

e co

mpl

eto:

Fre

eNAS

p.3

2

» Re

de s

adia

com

traf

fic s

hapi

ng p

.37

» Su

do: p

robl

ema

ou s

oluç

ão?

p.40

» Fc

ron,

um

Cro

n be

m m

elho

r p.4

4

LINU

X NA

CÂM

ARA

p.26

No

va m

igra

ção

par

a S

oft

war

e

Livr

e n

a C

âmar

a d

e C

amp

inas

CLOU

D CO

MPU

TING

E O

PEN

SOUR

CE p

.30

Ce

zar

Tau

rio

n li

sta

as in

icia

tiva

s

abe

rtas

par

a co

mp

uta

ção

em

nu

vem

SUPO

RTE

LOCA

L p.

28M

add

og

ex

pli

ca p

or

qu

e o

sup

ort

e lo

cal é

ess

en

cial

SEGU

RANÇ

A: C

RIPT

OGRA

FIA

P.70

No

segu

ndo

artig

o da

sér

ie, c

onhe

ça

exem

plos

de

bom

e m

au u

so d

a cr

ipto

grafi

a.

REDE

S: A

PACH

E +

SELI

NUX

P.64

Velo

cida

de o

u se

gura

nça?

Esc

olha

os

dois

com

o m

ódul

o m

od_s

elin

ux d

o Ap

ache

.

VEJA

TAM

BÉM

NES

TA E

DIÇÃ

O:»

Open

Sola

ris, p

arte

10:

Bac

kup

e re

stau

raçã

o em

UFS

p.5

4

» GP

S ra

stre

ado

com

o O

penG

TS p

.50

» N

ovo

edito

r XM

L liv

re: S

ynte

xt S

erna

p.4

8

» Al

ta d

ispo

nibi

lidad

e so

bre

Open

Sola

ris

p.58

PROG

RAM

AS, F

ERRA

MEN

TAS

E TÉ

CNIC

AS P

ARA

VOCÊ

GAR

ANTI

R A

SUA

TRAN

QUIL

IDAD

E E

O FU

NCIO

NAM

ENTO

PER

FEIT

O DO

S SI

STEM

AS p

. 31

SYSA

DMIN

WW

W.L

INU

XM

AG

AZI

NE

.CO

M.B

R

Page 5: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

74

CUDA

http://www.linuxmagazine.com.br

PROGRAMAÇÃO | CUDA CUDACUDA

4.3, antes de compilar os exemplos é necessário alterar a linha 126 do ar-quivo ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk da seguinte forma:

NVCCFLAGS += --compiler-options -fno-strict-aliasing --compiler-options -fno-inline

Teste práticoPara compilar os exemplos, basta executar os comandos a seguir:

$ cd ~/NVIDIA_GPU_Computing_SDK/C$ make

Em seguida, teste os exemplos como mostra a listagem 3. A figura 1 demonstra um programa que utiliza a tecnologia CUDA em tempo real.

Para “usar a força” (isto é, ler os fontes), basta abrir os exemplos lo-calizados na pasta ~/NVIDIA_GPU_Com-puting_SDK/C/src/.

Mão na massaAgora, com um simples programa em C, multiplicaremos um vetor com 50 milhões de elementos utili-zando a GPU e, em seguida, a CPU, para efeito de comparação temporal. Neste simples programa, criaremos

os vetores A e B, com o vetor B re-presentando o vetor A multiplicado pelo fator 2.

Com a função gettimeofday(), registraremos os tempos inicial e final da operação de multiplicação dos vetores. Com isso, tornaremos possível a medição do tempo de execução de cada um dos processos isoladamente. A listagem 4 mostra o código-fonte para efetuar os tes-tes mencionados (arquivo teste-NVIDIA.cu).

A função vecMult_d() é utilizada para efetuar o processamento na GPU; já a função vecMult_d() é vol-

Listagem 4: Programa de teste com vetores

01 #include <stdio.h>02 #include <stdlib.h>03 #include <cutil_inline.h>04 #include <cuda.h>05 #include <sys/time.h>06 #include <device_launch_parameters.h>07 08 __global__ void vecMult_d(int *A, int *B, int N)09 {10 0  int i = blockIdx.x * blockDim.x + threadIdx.x ;11    if(i<N)12    { B[i] = A[i]*2; }13 }14 15 void vecMult_h(int *A, int *B, int N)16 {17            for(int i=0;i<N;i++) { B[i] = A[i]*2; }18 }19 20 int main(int argc, char **argv)21 {22    int *a_h, *b_h;23    int *a_d, *b_d;24    int blocksize=512, n=50000000;25    struct timeval t1_start,t1_end,t2_start,t2_end;26    double time_d, time_h;27 28    // allocate arrays on host29    a_h = (int *)malloc(sizeof(int)*n);30    b_h = (int *)malloc(sizeof(int)*n);31 32    // allocate arrays on device33    cudaMalloc((void **)&a_d,n*sizeof(int));

34    cudaMalloc((void **)&b_d,n*sizeof(int));35    dim3 dimBlock( blocksize );36    dim3 dimGrid( ceil(float(n)/float(dimBlock.x)) );37 38    for(int j=0;j<n;j++) a_h[j]=j;39 40    // GPU41    cudaMemcpy(a_d,a_h,n*sizeof(int),cudaMemcpyHostToDevice); 42    gettimeofday(&t1_start,0);43    vecMult_d<<<dimGrid,dimBlock>>>(a_d,b_d,n);44    cudaThreadSynchronize();45    gettimeofday(&t1_end,0);46    cudaMemcpy(b_h,b_d,n*sizeof(int),cudaMemcpyDeviceToHost); 47 48    // CPU49    gettimeofday(&t2_start,0);50    vecMult_h(a_h,b_h,n);51    gettimeofday(&t2_end,0);52 53    time_d = (t1_end.tv_sec-t1_start.tv_sec)*1000000 + t1_end.tv_usec - t1_start.tv_usec;54    time_h = (t2_end.tv_sec-t2_start.tv_sec)*1000000 + t2_end.tv_usec - t2_start.tv_usec;55    printf(“%d %lf %lf\n”,n,time_d,time_h);56    free(a_h);57    free(b_h);58    cudaFree(a_d);59    cudaFree(b_d);60 61    return(0);62 }

Page 6: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

CUDACUDA

75

| PROGRAMAÇÃOCUDA

Linux Magazine #64 | Março de 2010

CUDA

tada para o processamento na CPU. A tradicional malloc() é utilizada para a alocação de memória, como também respectivamente a função cudaMalloc() para a GPU. A seguir, o comando para compilar o código-fonte de exemplo:

$ nvcc testeNVIDIA.cu \-o testeNVIDIA \--compiler-options \-fno-strict-aliasing \--compiler-options -fno-inline \-I/usr/local/cuda/include/ \-I[/home/user]/NVIDIA_GPU_Computing_SDK/C/common/inc/

Na linha de comando acima, testeNVIDIA.cu é o arquivo com o código-fonte, enquanto que nvcc é o compilador disponibilizado pela tecnologia CUDA. A arquitetu-ra CUDA, além do compilador, apresenta ferramentas capazes de suportar aplicações heterogêneas, ou seja, código que possui parte da programação serial ou para-lela executada na CPU ou GPU. Abaixo, o resultado do programa em execução.

$ ./testeNVIDIA50000000 28.000000 391692.000000

Como podemos observar nessa saída e na tabela 1, 50 milhões de elementos multiplicados na CPU levaram 391.692 microsegundos. Já na GPU, o mesmo cálculo levou apenas 28 µs!

CUDA em alto nívelThrust é uma biblioteca CUDA de algoritmos paralelos para o desenvol-vimento em C++ STL (biblioteca de algoritmos e estruturas de dados, inte-

grada à biblioteca padrão de C++). A biblioteca Thrust tem como principal objetivo prover uma interface flexí-vel e de alto nível para programação da GPU, obtendo assim ganhos de

Figura 1 Programa de exemplo para uso da tecnologia CUDA.

Listagem 5: Arquivo fill_copy_sequence.cu

01 #include <thrust/host_vector.h>02 #include <thrust/device_vector.h>03 #include <thrust/copy.h>04 #include <thrust/fill.h>05 #include <thrust/sequence.h>06 #include <iostream>07 08 int main(void)09 {10    thrust::device_vector<int> D(10, 1);11    thrust::fill(D.begin(), D.begin() + 7, 9);12    thrust::host_vector<int> H(D.begin(), D.begin() + 5);13    thrust::sequence(H.begin(), H.end());14    thrust::copy(H.begin(), H.end(), D.begin());15    for(int i = 0; i < D.size(); i++)16       std::cout << “D[“ << i << “] = “ << D[i] << std::endl;17    return 0;18 }

Tabela 1: Execução do teste comparativo

Modelo CPU/GPUTamanho do vetor:

50 milhõesTamanho do vetor:

100 milhõesTamanho do vetor:

400 milhões

GPU GeForce 8400M GS, 16 núcleos, 2 multiprocessadores, 256 MB de memória

28 µs 30 µs 35µs

Intel Core 2 Duo T7250, 2.o GHz, 2048 KB cache

391.692 µs 769.660 µs 3.021.525 µs

Page 7: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

76

CUDA

http://www.linuxmagazine.com.br

PROGRAMAÇÃO | CUDA

Mais informações

[1] Alessandro Faria, “Máquinas que enxergam”: http://lnm.com.br/article/3169

[2] Supercomputador movido a GPUs é adquirido pela Petrobras: http://lnm.com.br/noticia/3183

[3] Downloads da CUDA: http://www.nvidia.com/object/cuda_get.html

[4] openVIDIA: http://openvidia.sourceforge.net/index.php/OpenVIDIA

[5] GPUCV: https://picoforge.int-evry.fr/cgi-bin/twiki/view/Gpucv/Web/

[6] CUDA: http://www.nvidia.com/object/cuda_learn.html

[7] Exemplos de CUDA: https://visualization.hpc.mil/wiki/Simple_CUDA_Program

[8] Thrust: http://code.google.com/p/thrust/

[9] GPU4VISION: http://gpu4vision.icg.tugraz.at/index.php?content=downloads.php

[10] Vídeo de lançamento da tecnologia CUDA: http://www.youtube.com/watch?v=XtGf0HaW7x4

Gostou do artigo?Queremos ouvir sua opinião. Fale conosco em [email protected]

Este artigo no nosso site: http://lnm.com.br/article/3335

Sobre o autor

Alessandro Faria é sócio-proprietário da NETi Tecnologia (http://www.netitec.com.br), funda-da em Junho de 1996, empresa especializada em desenvolvimento de software e soluções bio-métricas. Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tec-nologia desde 1986, assim propiciando ao mercado soluções em software. Leva o Linux a sério desde 1998 com desenvolvimento de soluções open-source, membro colaborador da comunida-de Viva O Linux, mantenedor da biblioteca open-source de vídeo-captura entre outros projetos.

produtividade no desenvolvimento de aplicativos.

A biblioteca thrust versão 1.1 requer o pacote CUDA 2.3. Para confirmar essa dependência, basta executar o comando nvcc --version na linha de comando num sistema Linux:

$ nvcc --versionnvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2009 NVIDIA Corporation

Built on Thu_Jul_30_09:24:36_PDT_2009

Cuda compilation tools, release 2.3, V0.2.1221

Para entender o funcionamento da biblioteca Thrust, crie o arquivo fill_copy_sequence.cu com conteúdo ilustrado na listagem 5.

Na linha 10, primeiramente o pro-grama inicializa um vetor na GPU, denominado D, com dez elementos. Em seguida, os primeiros sete ele-mentos recebem o valor 9 (linha 11). Um novo vetor H é criado na CPU e recebe nos seus cinco elementos valores sequenciais de 0 a 4 (linhas 12 e 13). Todo o conteúdo do vetor H na CPU é copiado para o vetor D na GPU (linha 14) e, para finalizar, o vetor D da GPU é impresso na tela (linhas 15 e 16).

Para compilar a listagem 5, basta executar comando abaixo:

$ nvcc fill_copy_sequence.cu \-o fill_copy_sequence \--compiler-options \-fno-strict-aliasing \--compiler-options -fno-inline \-I/usr/local/cuda/include/ \-I[/home/user]/NVIDIA_GPU_Computing_SDK/C/common/inc/

Feito isso, basta executar o pro-grama recém-compilado:

$ ./fill_copy_sequenceD[0] = 0

D[1] = 1D[2] = 2D[3] = 3D[4] = 4D[5] = 9D[6] = 9D[7] = 1D[8] = 1D[9] = 1

Existem inúmeros projetos de Software Livre que utilizam a tec-nologia CUDA. Sendo assim, seria

impossível mencionar todas as aplicações e opções técnicas dispo-níveis. Mas vale a pena mencionar os projetos openVIDIA e GPU-CV. Essas bibliotecas são úteis quando o segmento em questão é a visão computacional; inclu-sive, a biblioteca GPUCV possui funções da biblioteca OpenCV portadas para GPUs. Logo, con-cluímos que explanar este assunto requer um artigo exclusivo (em breve). n

Page 8: por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de realidade aumentada, ... do paralelismo. Assim, ... também Python (PyCUDA). OpenCL

UBUNTU

Este livro é fruto da reunião de material produzido por autores da Linux New Media e seu objetivo é lançar luz sobre as várias etapas que compõem a adoção do Ubuntu como sistema operacional de produção.

Mais do que uma apresentação do Ubuntu ao usuário egresso do Microsoft Windows, o livro preenche as lacunas que podem difi cultar a adoção do novo sistema, seja no ambiente de trabalho, seja no ambiente doméstico. Temas que costumam ser negligenciados, como questões de licença, comerciais e de integração com redes Windows, são detalhados e comparados aos modelos tradicionais.

Para o leitor ligado à área comercial, logo no início do livro são demonstradas as origens e peculiaridades dos modelos de negócio e de desenvolvimento do Software Livre e de código aberto. Há muitas diferenças em relação ao chamado software fechado e proprietário – como é conhecido o modelo de desenvolvimento e comercial adotado por empresas como a Microsoft.

O leitor envolvido com a área técnica encontrará o passo a passo de instalação do Ubuntu – a partir do CD que acompanha o livro – sem comprometer o Windows que eventualmente já esteja instalado. Há também dois capítulos dedicados exclusivamente à integração do Ubuntu com um servidor Active Directory, da Microsoft, tarefa que costuma apresentar difi culdades aos administradores de rede.

Por fi m, é reservada ao usuário fi nal a demonstração de como realizar todas as tarefas cotidianas utilizando o novo sistema: conexão à Internet, instalação e atualização de programas, confi gurações comuns etc. Sobretudo, é demonstrado como utilizar os programas de escritório como o editor de textos, planilhas e apresentações, importantes para a maioria das pessoas e essenciais para as empresas.

UBUNTU Luciano A

ntonio Siqueira

UBUNTULuciano Antonio Siqueira

Guia de adoção do Ubuntu no ambiente doméstico

e corporativo

9 788561 024208

ISBN: 978-85-61024-20-8

Acompanha sistema completo com suporte e atualizações até 2011

C O L E Ç Ã O

Linux Pro

Ubuntu_capa.indd 1 14/07/09 11:56

Em seu novo título, Linux Pro Ubuntu, a Linux Magazine oferece uma visão mais aprofundada e abrangente do sistema. O objetivo da obra é atender aos principais públicos do Ubuntu: o usuário doméstico e o corporativo, ambos em processo de migração do Microsoft Windows para o Ubuntu.

Garanta já o seu pelo site da Linux Magazine!

www.LinuxMagazine.com.br

CUDACUDA