artigo - Linux Magazine

Transcrição

artigo - Linux Magazine
PROGRAMAÇÃO
Use sua GPU para agilizar os cálculos
A GPU que calculava
John evans – sxc.hu
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 horas. Protetores de tela que trabalham
em cluster utilizando a GPU permitirã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.
70
A edição 61 da Linux Magazine
contém um artigo sobre visão computacional [1] que menciona a aplicabilidade dessa tecnologia em projetos
de realidade aumentada, robótica e
biometria que utilizam reconhecimento de padrões e processamento
de imagens em tempo real.
Aplicar processos de visão computacional em fluxos de vídeo ao
vivo é uma tarefa morosa devido ao
grande consumo de processamento matemático. Esse custo computacional é 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,
http://www.linuxmagazine.com.br
CUDA | PROGRAMAÇÃO
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 problema, 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, caracterizandoo 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.
CUDA
A 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 tempo gasto por uma CPU. A seguir, os
principais recursos da tecnologia:
linguagem C padrão para desenvolvimento 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.
Linux Magazine #64 | Março de 2010
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 passaram a ganhar capacidade de processamento sequencial como as
CPUs. Os shaders permitem procedimentos de sombreamento e
iluminação, dando assim liberdade
aos programadores artistas. O termo “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 aproximadamente 3:36 minutos para ser co-
Listagem 1: Instalação do pacote CUDA Toolkit
# sh cudatoolkit_2.3_linux_64_suse11.1.run
Uncompressing 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
71
PROGRAMAÇÃO | CUDA
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 recursos das placas NVIDIA utilizando chamadas em C (C for CUDA,
compilador nvcc), o que é um processo relativamente fácil para os bons
programadores. Também existem abstrações de CUDA para a linguagem
Java (jCUDA), C# (CUDA.NET) e
também Python (PyCUDA).
OpenCL
O OpenCL pode ser entendido como
“parente” do OpenGL. Desenvolvido 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 aceleradores (processadores Cell). Isto demonstra a flexibilidade do projeto.
Embora pareça lógica a escolha
da tecnologia OpenCL em virtu-
Listagem 2: Instalação do pacote CUDA SDK
$ sh cudasdk_2.3_linux.run
Verifying 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 then
modify 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)...
72
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 abstrair algumas funções em virtude do
hardware em questão.
Está muito claro que os benefícios
dessa tecnologia são enormes. No entanto, as dificuldades são ainda maiores, 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 hardwares de 5.000 núcleos.
O processamento paralelo pela
GPU executa mais ações com menos tráfego de informações em barramentos, 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 dizem 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 matemáticos externos à CPU.
Download e instalação
Os arquivos necessários para se trabalhar com a tecnologia CUDA devem
ser obtidos no site da NVIDIA [3].
O arquivo cudatoolkit_2.3_linux_64_suse11.1.run contém as ferramentas de desenvolvimento (compilador, entre outros). Já o arquivo
cudasdk_2.3_linux.run, como o próprio
http://www.linuxmagazine.com.br
# 63
A REVISTA
CASE ALFRESCO
p.26
A Construcap
projetos com agilizou seus
o Alfresco
LINUX PARK
Iniciada em 2008 p.28
Porto Alegre
de seminários
Linux Park a temporada
de 2008
WWW.LINUXMAGAZINE.COM.BR
e
» OpenSolaris, parte 10: Backup
p.50
» GPS rastreado com o OpenGTS
Serna p.48
» Novo editor XML livre: Syntext
p.58
» Alta disponibilidade sobre OpenSolaris
VEJA TAMBÉM NESTA EDIÇÃO:
restauração em UFS p.54
No segundo artigo da série, conheça
criptografia.
exemplos de bom e mau uso da
SEGURANÇA: CRIPTOGRAFIA P.70
Velocidade ou segurança? Escolha
com o módulo mod_selinux do Apache.
REDES: APACHE + SELINUXosP.64
dois
» Storage completo: FreeNAS p.32
p.37
» Rede sadia com traffic shaping
» Sudo: problema ou solução? p.40
» Fcron, um Cron bem melhor p.44
CEZAR TAURION
O Código Aberto p.34
como
incentivo à
inovação
#44 07/08
SYSADMIN
PARA VOCÊ GARANTIR A SUA
PROGRAMAS, FERRAMENTAS E TÉCNICAS
PERFEITO DOS SISTEMAS p. 31
TRANQUILIDADE E O FUNCIONAMENTO
p.30
CÂM
Cezar Taurion lista as iniciativas
em nuvem
abertas para computação
CLOUD COMPUTING E OPEN SOURCE
LINUX NA
A REVISTA
ARA p.24
Nova migr
ação para
Livre na
Software
Câmara
de Camp
inas
Maddog explica por que o
suporte local é essencial
IONAL DE
DO PROFISS
SUPORTE LOCA
TI
L p.28
Maddog
explica
por que
suporte
o
local é esse
ncial
PUTIN
CLOUD COM
G E OPEN SOUR
Cezar Tauri
on lista
CE p.30
as inicia
abertas
tivas
para comp
utação em
nuvem
DO PROFISSIONAL
DE TI
WONDERSH
R$ 13,90
€ 7,50
DNSSEC p.69
p.64
vantagens
da
APER SUDO
FCRON CRIPTOGRA
FIA VEJA TAMBÉM
NESTA EDIÇÃO:
» Relatórios
do Squid com
o SARG p.60
» Java, Ruby
e Rails: conheça
o JRuby on
» Benchmarks
Rails p.74
do GCC 4.3?
p.58
de bancos
de dados com
a Libferris
2: Servidores
p.46
NIS e DHCP
p.52
» Becape
» LPI nível
REDES: APA
RIS OPEN
GTS SERNA ALTA DISPO
NIBILIDADE
Test PASSED
Press ENTER to exit...
73
WWW.LI
NUXMAG
AZIN
R
E.COM.B
NES
» OpenSola
ris, parte 10: TA EDIÇÃO:
Backup e
» GPS rastr
restauração
eado com
em UFS p.54
o OpenGTS
» Novo edito
p.50
r XML livre
: Syntext Sern
» Alta disp
onibilidade
a p.48
sobre Open
Solaris p.58
2010
11 4082-1300
Repita o procedimento para instalar o pacote CUDA SDK, executando o arquivo cudasdk_2.3_linux.
run (listagem 2).
É importante fazer uma ressalva neste ponto: para as versões 4.3
e posteriores do compilador GCC
VEJA TAMBÉM
: CRIPTO
No segundo
artigo da série GRAFIA p.70
de bom e
, conheça
mau usos
exemplos
da criptogra
fia.
UX OPEN
SOLA
SEGURANÇA
MOD_SELIN
CHE + SELINU
Velocidade
X p.64
ou seguranç
a? Escolha
com o mód
ulo mod_sel
os
inux do Apac dois
he.
» Storage
completo:
FreeNAS p.32
» Rede sadia
com traffic
shap
» Sudo: prob
lema ou soluç ing p.37
ão? p.40
» Fcron, um
Cron bem
melhor p.44
M.BR
WWW.LINUXMAGAZINE.CO
nova versão
do Internet
Protocol, e
veja por que
é difícil adotá-la
Conheça as
REDES: IPV6
Com o DNSSEC,
a resolução
de nomes
fica protegida
de ataques.
Mas seu
preço vale
a pena?
SEGURANÇA:
PROGRAMAS
, FERRAME
NTAS E TÉCN
TRANQUIL
IDADE E O
FUNCIONAME ICAS PARA VOCÊ GAR
ANTIR A SUA
NTO PERFEIT
O DOS SIST
EMAS p. 31
» O que dizem
certificados os profissionais
p.24
» Cobit, CMMI,
ITIL. Quais
melhores
as
práticas?
p.36
» ITIL na prática
p.39
» Novidades
do ITIL v3.
p.44
SEJA UM
BOM GESTOR
MELHORES
E UTILIZE
AS
PRÁTICAS
ADOTADAS
RECOMENDADAS
E
PELOS PROFISSIONAIS
MAIS EXPERIENTES
NESSA ÁREA
p.36
GOVERNANÇ
A COM
00044
FREENAS 9 771806
942009
# 63 Feve
reiro
e
SUPORTE LOCAL p.28
SYSADMIN
SYSADMIN
de
zine
proib ida
Linux Maga
exemplar
02/2010
venda Linux Magazine #64 | Março de 2010
Nova migração para Software
Livre na Câmara de Campinas
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)
Assinant
nome diz, são os arquivos de desenvolvimento 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 suporte a CUDA.
Para instalar o pacote CUDA
Toolkit, execute o arquivo cudatoolkit_2.3_linux_64_suse11.1.run, cuja
saída é ilustrada na listagem 1.
Em seguida, insira a linha a seguir no arquivo /etc/ld.so.conf ou
acrescente esse caminho à variável
de ambiente LD_LIBRARY_PATH:
LINUX NA CÂMARA p.26
CUDA | PROGRAMAÇÃO
/usr/local/cuda/lib64
Além disso, é preciso incluir o diretório bin/ na váriavel PATH:
export \
PATH=“$PATH:/usr/local/cuda/bin”
Listagem 3: Teste da SDK CUDA
cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release
$ ./deviceQuery
CUDA Device Query (Runtime API) version (CUDART static linking)
There is 1 device supporting CUDA
PROGRAMAÇÃO | CUDA
4.3, antes de compilar os exemplos
é necessário alterar a linha 126 do arquivo ~/NVIDIA_GPU_Computing_SDK/C/
common/common.mk da seguinte forma:
NVCCFLAGS += --compiler-options
-fno-strict-aliasing --compiler
-options -fno-inline
Teste prático
Para 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 localizados na pasta ~/NVIDIA_GPU_Computing_SDK/C/src/.
Mão na massa
Agora, com um simples programa
em C, multiplicaremos um vetor
com 50 milhões de elementos utilizando 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 representando 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 testes 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
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
74
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 // GPU
__global__ void vecMult_d(int *A, int *B, int N) 41 cudaMemcpy(a_d,a_h,n*sizeof(int),cudaMemcpyHo
stToDevice);
{
0 int i = blockIdx.x * blockDim.x + threadIdx.x ; 42 gettimeofday(&t1_start,0);
43 vecMult_d<<<dimGrid,dimBlock>>>(a_d,b_d,n);
if(i<N)
44 cudaThreadSynchronize();
{ B[i] = A[i]*2; }
45 gettimeofday(&t1_end,0);
}
46 cudaMemcpy(b_h,b_d,n*sizeof(int),cudaMemcpyDe
viceToHost);
void vecMult_h(int *A, int *B, int N)
47
{
for(int i=0;i<N;i++) { B[i] = A[i]*2; } 48 // CPU
49 gettimeofday(&t2_start,0);
}
50 vecMult_h(a_h,b_h,n);
51 gettimeofday(&t2_end,0);
int main(int argc, char **argv)
52
{
53 time_d = (t1_end.tv_sec-t1_start.tv_
int *a_h, *b_h;
sec)*1000000 + t1_end.tv_usec - t1_start.tv_usec;
int *a_d, *b_d;
54 time_h = (t2_end.tv_sec-t2_start.tv_
int blocksize=512, n=50000000;
struct timeval t1_start,t1_end,t2_start,t2_end; sec)*1000000 + t2_end.tv_usec - t2_start.tv_usec;
55 printf(“%d %lf %lf\n”,n,time_d,time_h);
double time_d, time_h;
56 free(a_h);
57 free(b_h);
// allocate arrays on host
58 cudaFree(a_d);
a_h = (int *)malloc(sizeof(int)*n);
59 cudaFree(b_d);
b_h = (int *)malloc(sizeof(int)*n);
60
61 return(0);
// allocate arrays on device
62 }
cudaMalloc((void **)&a_d,n*sizeof(int));
#include
#include
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<cutil_inline.h>
<cuda.h>
<sys/time.h>
<device_launch_parameters.h>
http://www.linuxmagazine.com.br
CUDA | PROGRAMAÇÃO
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ódigofonte 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 arquitetura 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 paralela executada na CPU ou GPU.
Abaixo, o resultado do programa
em execução.
$ ./testeNVIDIA
50000000 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!
Figura 1Programa de exemplo para uso da tecnologia CUDA.
Listagem 5: Arquivo fill_copy_sequence.cu
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include
#include
#include
#include
#include
#include
<thrust/host_vector.h>
<thrust/device_vector.h>
<thrust/copy.h>
<thrust/fill.h>
<thrust/sequence.h>
<iostream>
int main(void)
{
thrust::device_vector<int> D(10, 1);
thrust::fill(D.begin(), D.begin() + 7, 9);
thrust::host_vector<int> H(D.begin(), D.begin() + 5);
thrust::sequence(H.begin(), H.end());
thrust::copy(H.begin(), H.end(), D.begin());
for(int i = 0; i < D.size(); i++)
std::cout << “D[“ << i << “] = “ << D[i] << std::endl;
return 0;
}
CUDA em alto nível
Thrust é uma biblioteca CUDA de
algoritmos paralelos para o desenvolvimento 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
Tabela 1: Execução do teste comparativo
Modelo CPU/GPU
GPU GeForce 8400M GS, 16 núcleos,
2 multiprocessadores, 256 MB de memória
Intel Core 2 Duo T7250, 2.o
GHz, 2048 KB cache
Linux Magazine #64 | Março de 2010
Tamanho do vetor:
50 milhões
Tamanho do vetor:
100 milhões
Tamanho do vetor:
400 milhões
28 µs
30 µs
35µs
391.692 µs
769.660 µs
3.021.525 µs
75
PROGRAMAÇÃO | CUDA
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 --version
nvcc: 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 programa inicializa um vetor na GPU,
denominado D, com dez elementos.
Em seguida, os primeiros sete elementos 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 programa recém-compilado:
$ ./fill_copy_sequence
D[0] = 0
76
D[1]
D[2]
D[3]
D[4]
D[5]
D[6]
D[7]
D[8]
D[9]
=
=
=
=
=
=
=
=
=
1
2
3
4
9
9
1
1
1
Existem inúmeros projetos de
Software Livre que utilizam a tecnologia CUDA. Sendo assim, seria
impossível mencionar todas as
aplicações e opções técnicas disponíveis. Mas vale a pena mencionar
os projetos openVIDIA e GPUCV. Essas bibliotecas são úteis
quando o segmento em questão
é a visão computacional; inclusive, a biblioteca GPUCV possui
funções da biblioteca OpenCV
portadas para GPUs. Logo, concluímos que explanar este assunto
requer um artigo exclusivo (em
breve). n
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
Sobre o autor
Alessandro Faria é sócio-proprietário da NETi Tecnologia (http://www.netitec.com.br), fundada em Junho de 1996, empresa especializada em desenvolvimento de software e soluções biométricas. Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia 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 comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo-captura entre outros projetos.
Gostou do artigo?
Queremos ouvir sua opinião. Fale conosco em
[email protected]
Este artigo no nosso site:
http://lnm.com.br/article/3335
http://www.linuxmagazine.com.br
CUDA
Linux Pro
COLEÇÃO
UBUNTU
UBUNTU
Acompanha sistema completo com suporte e
atualizações até 2011
Luciano Antonio Siqueira
Luciano Antonio Siqueira
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.
Guia de adoção do Ubuntu
no ambiente doméstico
e corporativo
Garanta já o seu pelo
site da Linux Magazine!
www.LinuxMagazine.com.br
14/07/09 11:56

Documentos relacionados

MINI-CURSO: Introdução à Programação em CUDA

MINI-CURSO: Introdução à Programação em CUDA CUDA pode ser obtido gratuitamente no site da nVidia: http://www.nvidia.com/object/cuda_get.html Disponível para Windows (XP, Vista e 7), Linux e MacOS X, em versões de 32 e 64 bits. É composto por...

Leia mais