Você está na página 1de 8

Use sua GPU para agilizar os cálculos

PROGRAMAÇÃO

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)

John evans – sxc.hu

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

70 http://www.linuxmagazine.com.br
CUDA | PROGRAMAÇÃO

melhor o desempenho. Contudo, No passado, era muito clara essa aos programadores artistas. O ter-
na prática, isso não acontece por diferença entres os chips, pois as mo “shader” é originado programa
um motivo principal: o software placas 3D processavam muitos tri- RenderMan, criado pela Pixar no
está anos atrás do hardware. Uma ângulos por segundo (como a 3dfx final da década de 80.
CPU com quatro núcleos pode Voodoo, por exemplo). Porém, com Uma placa de vídeo GeForce
perder em termos de desempenho o surgimento dos shaders (rotinas 9600 GT apresenta desempenho
nos jogos pelo fato do software ser criadas para tarefas específicas na fantástico quando comparada a um
otimizado para dois núcleos. A criação de cenas), as GPUs passa- processador Intel Core 2 Duo E6700
programação paralela para quatro ram a ganhar capacidade de pro- na tarefa de codificação de vídeos
núcleos significa aumentar o pro- cessamento sequencial como as H.264. Nos testes realizados para
blema, sem contar a otimização CPUs. Os shaders permitem pro- este artigo, um trailer na resolução
dos compiladores para fazer uso cedimentos de sombreamento e de 1920x1080 pixels levou aproxima-
do paralelismo. iluminação, dando assim liberdade damente 3:36 minutos para ser co-
Assim, entendemos a recente
aquisição de um supercomputador
baseado em GPUs pela Petrobras Listagem 1: Instalação do pacote CUDA Toolkit
[2]. O seu poder de processamento
# sh cudatoolkit_2.3_linux_64_suse11.1.run
é de 250 Teraflops, caracterizando-
Uncompressing NVIDIA CUDA...........................................
o como 16º maior supercomputador ....................................................................
do planeta. ....................................................................
Para entender melhor a diferença ....................................
fundamental entre os processadores Enter install path (default /usr/local/cuda, ‘/cuda’ will be appended):
convencionais (CPUs) e os chips de
vídeo (GPUs), é importante saber “man/man3/cudaBindTexture.3” -> “/usr/local/cuda/man/man3
que as CPUs são otimizadas para /cudaBindTexture.3”
cálculos sequenciais, enquanto que “man/man3/cuMemsetD2D32.3” -> “/usr/local/cuda/man/man3
as GPUs são otimizadas para cálculos /cuMemsetD2D32.3”
intensamente paralelos. “man/man3/NumChannels.3” -> “/usr/local/cuda/man/man3/NumChannels.3”
“man/man3/cudaD3D9ResourceSetMapFlags.3” -> “/usr/local/cuda/man/man3/
CUDA cudaD3D9ResourceSetMapFlags.3”
A tecnologia NVIDIA CUDA é uma “man/man3/CUDA_ERROR_INVALID_HANDLE.3” -> “/usr/local/cuda/man/man3
arquitetura de computação paralela /CUDA_ERROR_INVALID_HANDLE.3”
cujo objetivo principal é tirar proveito “man/man3/cudaDeviceProp.3” -> “/usr/local/cuda/man/man3
máximo da computação paralela das /cudaDeviceProp.3”
GPUs NVIDIA, com a finalidade de “man/man3/CU_MEMHOSTALLOC_PORTABLE.3” -> “/usr/local/cuda/man/man3
resolver problemas computacionais /CU_MEMHOSTALLOC_PORTABLE.3”
complexos em uma fração do tem-
========================================
po gasto por uma CPU. A seguir, os
principais recursos da tecnologia:
* Please make sure your PATH includes /usr/local/cuda/bin
linguagem C padrão para de-
* Please make sure your LD_LIBRARY_PATH
senvolvimento de aplicativos * for 32-bit Linux distributions includes /usr/local/cuda/lib
em paralelo na GPU; * for 64-bit Linux distributions includes /usr/local/cuda/lib64
lbibliotecas numéricas padrão * OR
para FFT e BLAS; * for 32-bit Linux distributions add /usr/local/cuda/lib
ltransferência rápida de dados * for 64-bit Linux distributions add /usr/local/cuda/lib64
entre a GPU e a CPU; * to /etc/ld.so.conf and run ldconfig as root
linteroperação do driver CUDA
com os drivers gráficos OpenGL * Please read the release notes in /usr/local/cuda/doc/
e DirectX;
lsuporte a sistemas operacionais * To uninstall CUDA, delete /usr/local/cuda
Linux de 32 e 64 bits e Windows * Installation Complete
XP de 32 e 64 bits.

Linux Magazine #64 | Março de 2010 71


PROGRAMAÇÃO  | CUDA

dificado pela GPU; já a codificação Java (jCUDA), C# (CUDA.NET) e de de sua compatibilidade com as
por processos convencionais (isto também Python (PyCUDA). GPUs, a prática retrata um cenário
é, CPUs) levou em torno de 17:17 um pouco diferente. O OpenCL
minutos. Logo, é possível utilizar OpenCL proporciona funções específicas
a tecnologia NVIDIA CUDA para O OpenCL pode ser entendido como para cada fámilia de GPUs. Com
codificar e decodificar vídeos, como “parente” do OpenGL. Desenvolvi- isso, o desenvolvimento de soluções
também em aplicações científicas de do pelo Khronos Group, associação e aplicativos genéricos implica abs-
alta performance. de fabricantes dedicada à criação de trair algumas funções em virtude do
A CUDA permite empregar re- padrões abertos, o OpenCL permite hardware em questão.
cursos das placas NVIDIA utilizan- não somente o uso de GPUs, como Está muito claro que os benefícios
do chamadas em C (C for CUDA, também o acesso aos chips acelera- dessa tecnologia são enormes. No en-
compilador nvcc), o que é um pro- dores (processadores Cell). Isto de- tanto, as dificuldades são ainda maio-
cesso relativamente fácil para os bons monstra a flexibilidade do projeto. res, pois o desenvolvimento paralelo
programadores. Também existem abs- Embora pareça lógica a escolha exige aplicar nova metodologia de
trações de CUDA para a linguagem da tecnologia OpenCL em virtu- desenvolvimento. Poucos aplicativos
são capazes de explorar tecnologias
com quatro núcleos; imagine então
Listagem 2: Instalação do pacote CUDA SDK como utilizar os recursos de hard-
wares de 5.000 núcleos.
$ sh cudasdk_2.3_linux.run O processamento paralelo pela
Verifying archive integrity... All good. GPU executa mais ações com me-
Uncompressing NVIDIA GPU Computing SDK............................. 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),
Enter install path (default ~/NVIDIA_GPU_Computing_SDK): which: no
será possível desenvolver cálculos
nvcc in (/usr/lib64/mpi/gcc/openmpi/bin:/home/cabelo/bin:/usr moleculares de maneira simples e
/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games: integrada com as GPUs. Logo, o
/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin) trabalho que uma CPU processa
em dias será processado em horas.
Could not locate CUDA. Enter the full path to CUDA. Os especialistas no segmento di-
If you do not know the path, accept the default and then zem que, no futuro, os processadores
modify the CUDA_INSTALL_PATH variable in terão uma unidade de processamento
/home/cabelo/NVIDIA_GPU_Computing_SDK/shared/common.mk. paralelo integrada, executando assim
múltiplas funções. Então, é possível
acreditar que a GPU será mais um
“sdk/shared/inc/stopwatch_base.inl” -> “/home/cabelo/NVIDIA_GPU_ processador auxiliar, como aconteceu
Computing_SDK/shared/inc/stopwatch_base.inl” com o co-processador matemático
“sdk/shared/inc/nvShaderUtils.h” -> “/home/cabelo/NVIDIA_GPU_
integrado nos processadores 486. Na
Computing_SDK/shared/inc/nvShaderUtils.h”
geração dos processadores 386, era
“sdk/shared/inc/stopwatch.h” -> “/home/cabelo/NVIDIA_GPU_Computing_
preciso usar co-processadores mate-
SDK/shared/inc/stopwatch.h”
“sdk/shared/inc/cudpp” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK
máticos externos à CPU.
/shared/inc/cudpp”
“sdk/shared/inc/cudpp/cudpp.h” -> “/home/cabelo/NVIDIA_GPU_ Download e instalação
Computing_SDK/shared/inc/cudpp/cudpp.h” Os arquivos necessários para se traba-
“sdk/shared/Makefile” -> “/home/cabelo/NVIDIA_GPU_Computing_SDK lhar com a tecnologia CUDA devem
/shared/Makefile” ser obtidos no site da NVIDIA [3].
O arquivo cudatoolkit_2.3_li-
======================================== nux_64_suse11.1.run contém as ferra-
Configuring SDK Makefile (/home/cabelo/NVIDIA_GPU_Computing_SDK mentas de desenvolvimento (com-
/shared/common.mk)... pilador, entre outros). Já o arquivo
cudasdk_2.3_linux.run, como o próprio

72 http://www.linuxmagazine.com.br
te a CUDA.

Test PASSED
Warp size:

Integrated:
Clock rate:
$ ./deviceQuery

Compute mode:
Number of cores:

Linux Magazine #64 | Março de 2010


Press ENTER to exit...
Texture alignment:
CUDA Driver Version:

Maximum memory pitch:


CUDA Runtime Version:
volvimento com exemplos.

de ambiente LD_LIBRARY_PATH:

Device 0: “GeForce 8400M GS”


saída é ilustrada na listagem 1.

Run time limit on kernels:


Number of multiprocessors:
There is 1 device supporting CUDA
princípio de que o equipamento

acrescente esse caminho à variável


guir no arquivo /etc/ld.so.conf ou
Em seguida, insira a linha a se-
olkit_2.3_linux_64_suse11.1.run, cuja
Toolkit, execute o arquivo cudato-
Para instalar o pacote CUDA
versão 190 ou superior, com supor-
possui instalado o driver NVIDIA
Atenção: este artigo parte do
nome diz, são os arquivos de desen-

Concurrent copy and execution:


Total amount of global memory:
Listagem 3: Teste da SDK CUDA

Total amount of constant memory:

Maximum number of threads per block:


CUDA Capability Minor revision number:
CUDA Capability Major revision number:
export \

Support host page-locked memory mapping:


Total amount of shared memory per block:

Maximum sizes of each dimension of a grid:


Maximum sizes of each dimension of a block:
cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release

host threads can use this device simultaneously)


run (listagem 2).

2
1
1

No
No
32
16

Yes
Yes
512
Total number of registers available per block: 8192
2.30
2.30
/usr/local/cuda/lib64

0.80 GHz
256 bytes
16384 bytes
65536 bytes

262144 bytes
CUDA Device Query (Runtime API) version (CUDART static linking)
retório bin/ na váriavel PATH:

512 x 512 x 64
268107776 bytes
PATH=“$PATH:/usr/local/cuda/bin”

Default (multiple
65535 x 65535 x 1
e posteriores do compilador GCC
va neste ponto: para as versões 4.3
É importante fazer uma ressal-
tando o arquivo cudasdk_2.3_linux.
talar o pacote CUDA SDK, execu-
Repita o procedimento para ins-
Além disso, é preciso incluir o di-

LINUX NA
ARA p.24 CÂM

02/2010
Nova migr
ação para
Livre na Software SUPORTE LOCA
Câmara L p.28
de Camp
inas Maddog
explica
p.30
CLOUD COMPUTING E OPEN SOURCE
SUPORTE LOCAL p.28
por que
LINUX NA CÂMARA p.26 Cezar Taurion lista as iniciativas
Maddog explica por que o em nuvem
o
CLOUD COM
Nova migração para Software abertas para computação
suporte
suporte local é essencial
Livre na Câmara de Campinas
local é esse PUTIN
ncial Cezar Tauri
on lista
G E OPEN SOUR
abertas as inicia CE p.30
para comp tivas
utação em
nuvem

Linux Maga
zine
# 63 Feve
PARA VOCÊ GARANTIR A SUA
SYSADMIN
PROGRAMAS, FERRAMENTAS E TÉCNICAS
TRANQUILIDADE E O FUNCIONAMENTO
PERFEITO DOS SISTEMAS p. 31
reiro 2010
» 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

dois
REDES: APACHE + SELINUXosP.64
Velocidade ou segurança? Escolha
com o módulo mod_selinux do Apache.

SEGURANÇA: CRIPTOGRAFIA P.70


No segundo artigo da série, conheça
criptografia.
exemplos de bom e mau uso da

# 63
VEJA TAMBÉM NESTA EDIÇÃO:
restauração em UFS p.54
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

WWW.LINUXMAGAZINE.COM.BR

A REVISTA
DO PROFISS
IONAL DE
TI

SYSADMIN
  FREENAS 
CASE ALFRESCO
A Construcap p.26
projetos com agilizou seus LINUX PARK
o Alfresco Iniciada em 2008 p.28
Porto Alegre
de seminários
Linux Park a temporada CEZAR TAURION
de 2008 O Código Aberto p.34
incentivo à como
inovação

#44 07/08

R$ 13,90
€ 7,50

00044
A REVISTA
DO PROFISSIONAL
DE TI

942009
e

GOVERNANÇ

9 771806

WONDERSH
A COM
de

SEJA UM
BOM GESTOR
MELHORES E UTILIZE
PRÁTICAS AS
RECOMENDADAS ADOTADAS
E
PELOS PROFISSIONAIS
MAIS EXPERIENTES
NESSA ÁREA
» O que dizem p.36
certificados os profissionais
p.24
» Cobit, CMMI,
melhores ITIL. Quais
práticas? as
proib ida

p.36
» ITIL na prática
p.39
» Novidades
do ITIL v3.
p.44
exemplar

APER  SUDO
SEGURANÇA:
Com o DNSSEC, DNSSEC p.69
a resolução VEJA TAMBÉM
de nomes NESTA EDIÇÃO:
PROGRAMAS
fica protegida » Relatórios
de ataques. do Squid com
Mas seu o SARG p.60
preço vale » Java, Ruby
a pena? e Rails: conheça
» Benchmarks o JRuby on
, FERRAME
REDES: IPV6 do GCC 4.3? Rails p.74
p.64 » Becape p.58
Conheça as
vantagens de bancos
nova versão da » LPI nível
de dados com
a Libferris
do Internet 2: Servidores p.46
TRANQUIL NTAS E TÉCN
Protocol, e NIS e DHCP
veja por que p.52
venda  

é difícil adotá-la
IDADE E O
WWW.LINUXMAGAZINE.CO
M.BR
FUNCIONAME ICAS PARA VOCÊ GAR

  FCRON 
NTO PERFEIT ANTIR A SUA
SYSADMIN
O DOS SIST
Assinant

EMAS p. 31
» Storage
completo:
» Rede sadia FreeNAS p.32
com traffic

CRIPTOGRA
» Sudo: prob shap
lema ou soluç ing p.37

FIA 
» Fcron, um ão? p.40
Cron bem
melhor p.44

MOD_SELIN
REDES: APA

UX  OPEN
Velocidade CHE + SELINU
com o mód
ou seguranç
a? Escolha
X p.64
os

SOLA
ulo mod_sel
inux do Apac dois
he.

RIS  OPEN
CUDA | PROGRAMAÇÃO

SEGURANÇA

GTS 
No segundo : CRIPTO
artigo da série GRAFIA p.70
de bom e , conheça
mau usos exemplos
da criptogra
fia.

SERNA  ALTA 
11 4082-1300

DISPO
VEJA TAMBÉM
» OpenSola NES
ris, parte 10: TA EDIÇÃO:
» GPS rastr Backup e
restauração
NIBILIDADE
eado com

73
o OpenGTS em UFS p.54
» Novo edito
r XML livre p.50
» Alta disp : Syntext Sern
onibilidade a p.48
sobre Open
Solaris p.58

WWW.LI
NUXMAG
AZIN E.COM.B
R
PROGRAMAÇÃO  | CUDA

4.3, antes de compilar os exemplos Em seguida, teste os exemplos os vetores A e B, com o vetor B re-
é necessário alterar a linha 126 do ar- como mostra a listagem 3. A figura 1 presentando o vetor A multiplicado
quivo ~/NVIDIA_GPU_Computing_SDK/C/ demonstra um programa que utiliza pelo fator 2.
common/common.mk da seguinte forma: a tecnologia CUDA em tempo real. Com a função gettimeofday(),
Para “usar a força” (isto é, ler os registraremos os tempos inicial e
NVCCFLAGS += --compiler-options fontes), basta abrir os exemplos lo- final da operação de multiplicação
-fno-strict-aliasing --compiler calizados na pasta ~/NVIDIA_GPU_Com- dos vetores. Com isso, tornaremos
-options -fno-inline puting_SDK/C/src/. possível a medição do tempo de
execução de cada um dos processos
Mão na massa isoladamente. A listagem 4 mostra
Teste prático Agora, com um simples programa o código-fonte para efetuar os tes-
Para compilar os exemplos, basta em C, multiplicaremos um vetor tes mencionados (arquivo teste­
executar os comandos a seguir: com 50 milhões de elementos utili- NVIDIA.cu).
zando a GPU e, em seguida, a CPU, A função vecMult_d() é utilizada
$ cd ~/NVIDIA_GPU_Computing_SDK/C para efeito de comparação temporal. para efetuar o processamento na
$ make Neste simples programa, criaremos GPU; já a função vecMult_d() é vol-

Listagem 4: Programa de teste com vetores


01 #include <stdio.h> 34    cudaMalloc((void **)&b_d,n*sizeof(int));
02 #include <stdlib.h> 35    dim3 dimBlock( blocksize );
03 #include <cutil_inline.h> 36    dim3 dimGrid( ceil(float(n)/float(dimBlock.x)) );
04 #include <cuda.h> 37
05 #include <sys/time.h> 38    for(int j=0;j<n;j++) a_h[j]=j;
06 #include <device_launch_parameters.h> 39
07 40    // GPU
08 __global__ void vecMult_d(int *A, int *B, int N) 41    cudaMemcpy(a_d,a_h,n*sizeof(int),cudaMemcpyHo
09 { stToDevice);
10 0  int i = blockIdx.x * blockDim.x + threadIdx.x ; 42    gettimeofday(&t1_start,0);
11    if(i<N) 43    vecMult_d<<<dimGrid,dimBlock>>>(a_d,b_d,n);
12    { B[i] = A[i]*2; } 44    cudaThreadSynchronize();
13 } 45    gettimeofday(&t1_end,0);
14 46    cudaMemcpy(b_h,b_d,n*sizeof(int),cudaMemcpyDe
15 void vecMult_h(int *A, int *B, int N) viceToHost);
16 { 47
17            for(int i=0;i<N;i++) { B[i] = A[i]*2; } 48    // CPU
18 } 49    gettimeofday(&t2_start,0);
19 50    vecMult_h(a_h,b_h,n);
20 int main(int argc, char **argv) 51    gettimeofday(&t2_end,0);
21 { 52
22    int *a_h, *b_h; 53    time_d = (t1_end.tv_sec-t1_start.tv_
23    int *a_d, *b_d; sec)*1000000 + t1_end.tv_usec - t1_start.tv_usec;
24    int blocksize=512, n=50000000; 54    time_h = (t2_end.tv_sec-t2_start.tv_
25    struct timeval t1_start,t1_end,t2_start,t2_end; sec)*1000000 + t2_end.tv_usec - t2_start.tv_usec;
26    double time_d, time_h; 55    printf(“%d %lf %lf\n”,n,time_d,time_h);
27 56    free(a_h);
28    // allocate arrays on host 57    free(b_h);
29    a_h = (int *)malloc(sizeof(int)*n); 58    cudaFree(a_d);
30    b_h = (int *)malloc(sizeof(int)*n); 59    cudaFree(b_d);
31 60
32    // allocate arrays on device 61    return(0);
33    cudaMalloc((void **)&a_d,n*sizeof(int)); 62 }

74 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ó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/ Figura 1 Programa de exemplo para uso da tecnologia CUDA.

Na linha de comando acima, Listagem 5: Arquivo fill_copy_sequence.cu


testeNVIDIA.cu é o arquivo com o
código-fonte, enquanto que nvcc é 01 #include <thrust/host_vector.h>
02 #include <thrust/device_vector.h>
o compilador disponibilizado pela 03 #include <thrust/copy.h>
tecnologia CUDA. A arquitetu- 04 #include <thrust/fill.h>
ra CUDA, além do compilador, 05 #include <thrust/sequence.h>
apresenta ferramentas capazes de 06 #include <iostream>
07
suportar aplicações heterogêneas, 08 int main(void)
ou seja, código que possui parte 09 {
da programação serial ou para- 10    thrust::device_vector<int> D(10, 1);
11    thrust::fill(D.begin(), D.begin() + 7, 9);
lela executada na CPU ou GPU. 12    thrust::host_vector<int> H(D.begin(), D.begin() + 5);
Abaixo, o resultado do programa 13    thrust::sequence(H.begin(), H.end());
em execução. 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;
$ ./testeNVIDIA 17    return 0;
50000000 28.000000 391692.000000 18 }

Como podemos observar nessa


saída e na tabela 1, 50 milhões de CUDA em alto nível grada à biblioteca padrão de C++). A
elementos multiplicados na CPU Thrust é uma biblioteca CUDA de biblioteca Thrust tem como principal
levaram 391.692 microsegundos. Já algoritmos paralelos para o desenvol- objetivo prover uma interface flexí-
na GPU, o mesmo cálculo levou vimento em C++ STL (biblioteca de vel e de alto nível para programação
apenas 28 µs! algoritmos e estruturas de dados, inte- da GPU, obtendo assim ganhos de

Tabela 1: Execução do teste comparativo


Tamanho do vetor: Tamanho do vetor: Tamanho do vetor:
Modelo CPU/GPU
50 milhões 100 milhões 400 milhões
GPU GeForce 8400M GS, 16 núcleos,
28 µs 30 µs 35µs
2 multiprocessadores, 256 MB de memória

Intel Core 2 Duo T7250, 2.o


391.692 µs 769.660 µs 3.021.525 µs
GHz, 2048 KB cache

Linux Magazine #64 | Março de 2010 75


PROGRAMAÇÃO  | CUDA

produtividade no desenvolvimento D[1] = 1 impossível mencionar todas as


de aplicativos. D[2] = 2 aplicações e opções técnicas dispo-
A biblioteca thrust versão 1.1 requer D[3] = 3 níveis. Mas vale a pena mencionar
o pacote CUDA 2.3. Para confirmar D[4] = 4 os projetos openVIDIA e GPU-
essa dependência, basta executar o D[5] = 9 CV. Essas bibliotecas são úteis
comando nvcc --version na linha de D[6] = 9 quando o segmento em questão
comando num sistema Linux: D[7] = 1 é a visão computacional; inclu-
D[8] = 1 sive, a biblioteca GPUCV possui
$ nvcc --version D[9] = 1 funções da biblioteca OpenCV
nvcc: NVIDIA (R) Cuda compiler portadas para GPUs. Logo, con-
driver Existem inúmeros projetos de cluímos que explanar este assunto
Copyright (c) 2005-2009 NVIDIA Software Livre que utilizam a tec- requer um artigo exclusivo (em
Corporation nologia CUDA. Sendo assim, seria breve).  n
Built on Thu_Jul_30_09:24:36_
PDT_2009
Cuda compilation tools, release
Mais informações
2.3, V0.2.1221
[1] Alessandro Faria, “Máquinas que enxergam”:
Para entender o funcionamento http://lnm.com.br/article/3169
da biblioteca Thrust, crie o arquivo [2] Supercomputador movido a GPUs é adquirido pela Petrobras:
fill_copy_sequence.cu com conteúdo http://lnm.com.br/noticia/3183
ilustrado na listagem 5.
Na linha 10, primeiramente o pro- [3] Downloads da CUDA: http://www.nvidia.com/object/cuda_get.html
grama inicializa um vetor na GPU, [4] openVIDIA: http://openvidia.sourceforge.net/index.php/OpenVIDIA
denominado D, com dez elementos.
Em seguida, os primeiros sete ele- [5] GPUCV: https://picoforge.int-evry.fr/cgi-bin/twiki/view/Gpucv/Web/
mentos recebem o valor 9 (linha 11). [6] CUDA: http://www.nvidia.com/object/cuda_learn.html
Um novo vetor H é criado na CPU
e recebe nos seus cinco elementos [7] Exemplos de CUDA:
valores sequenciais de 0 a 4 (linhas https://visualization.hpc.mil/wiki/Simple_CUDA_Program
12 e 13). Todo o conteúdo do vetor [8] Thrust: http://code.google.com/p/thrust/
H na CPU é copiado para o vetor D
na GPU (linha 14) e, para finalizar, o [9] GPU4VISION:
http://gpu4vision.icg.tugraz.at/index.php?content=downloads.php
vetor D da GPU é impresso na tela
(linhas 15 e 16). [10] Vídeo de lançamento da tecnologia CUDA:
Para compilar a listagem 5, basta http://www.youtube.com/watch?v=XtGf0HaW7x4
executar comando abaixo:

$ nvcc fill_copy_sequence.cu \
-o fill_copy_sequence \
Sobre o autor
--compiler-options \ 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-
-fno-strict-aliasing \
métricas. Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tec-
--compiler-options -fno-inline \ nologia desde 1986, assim propiciando ao mercado soluções em software. Leva o Linux a sério
-I/usr/local/cuda/include/ \ 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.
-I[/home/user]/NVIDIA_GPU_
Computing_SDK/C/common/inc/
Gostou do artigo?
Feito isso, basta executar o pro-
Queremos ouvir sua opinião. Fale conosco em
grama recém-compilado: cartas@linuxmagazine.com.br

$ ./fill_copy_sequence Este artigo no nosso site:


http://lnm.com.br/article/3335
D[0] = 0

76 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 Garanta já o seu pelo
e corporativo
site da Linux Magazine!

www.LinuxMagazine.com.br
14/07/09 11:56

Você também pode gostar