por Alessandro de Oliveira Faria (Cabelo)€¦ · bilidade dessa tecnologia em projetos de...

Preview:

Citation preview

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

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

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)...

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

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 }

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

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 cartas@linuxmagazine.com.br

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

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

Recommended