Upload
doankhanh
View
214
Download
1
Embed Size (px)
Citation preview
70
CUDA
http://www.linuxmagazine.com.br
CUDAP
RO
GR
AM
AÇ
Ã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
8»
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
2»
Rede
sad
ia c
om tr
affic
sha
ping
p.3
7»
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
8»
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 [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
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