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