Você está na página 1de 59

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Minicurso de CUDA
Introduo ao processamento de alto desempenho com o uso de Unidades de Processamento Grfico (GPU), com nfase em aplicaes de clculo numrico Augusto Brando d' Oliveira (1),(2),(3) Diviso de Satlites Espaciais e Grupo de Processamento de Alto Desempenho Centro de Previso de Tempo e Estudos Climticos (CPTEC/INPE) Instituto Nacional de Pesquisas Espaciais INPE e-mail: augusto.oliveira@cptec.inpe.br
e Ncleo de Pesquisas Tecnolgicas Ps-Graduao em Engenharia Biomdica Universidade de Mogi das Cruzes

(1)Prof.Titular - Ps-Graduao em Engenharia Bio Mdica Universidade de Mogi da CruzesNcleo de Pesquisas Tecnolgicas - NPT-UMC (2)Pesquisador Senior - Diviso de Satlites Ambientais-DSA-CPTEC-INPE e Grupo de Processamento de Alto Desempenho-PAD-CPTEC-INPE (3)Professor Titular (aposentado) UNESP Campus de So Jos do Rio Preto-SP

Resumo: Apresenta-se uma introduo ao processamento de alto desempenho com o uso de Unidades de Processamento Grfico (GPU), com nfase em aplicaes de clculo numrico. Discute-se aspectos bsicos da programao CUDA C, bem como de bibliotecas como CULAPACK, CUBLAS e CUFFT. Um sistema de computao, massivamente paralelo baseado em CPU, de 100 TeraFlops, no mercado internacional custa aproximadamente US$ 3 100 000.00 e tem um consumo tpico de 575 kW. Um sistema equivalente com GPU, custa apenas cerca de 300 mil dlares, e consome cerca de 27,5 kW. Isto significa 10X menos na parte de custos e 20X menos na parte de consumo de energia eltrica O minicurso visa divulgar o uso de CUDA entre matemticos, e incentivar o seu uso e o acompanhamento dessa nova tecnologia que promete avanos impressionantes nos prximos anos. Trata-se do advento da supercomputao pessoal. O minicurso pretende tambm tornar mais fcil para o interessado instalar e comear a usar essa tecnologia. Ser distribuido farto material sobre o assunto.

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Prefcio Este minicurso de CUDA orientado para alunos, professores e pesquisadores interessados em comear a fazer uso do imenso potencial de clculo disponvel com o uso das GPUs, em particular de CUDA, e servir de ponto de partida para a montagem ou aquisio de um sistema com uma placa de video, apropriado para uma iniciao a CUDA. Embora o pblico alvo que temos em mente seja bastante variado, este minicurso se destina principalmente a profisionais da rea de engenharia biomdica, meteorologia e matemtica aplicada e alunos e professores dessas reas. Ele no objetiva ensinar a programao C em CUDA, porm pode ser um ponto de partida para este aprendizado, Visa introduzir a tecnologia CUDA, aspectos do hardware, da estrutura de memria, dos conceitos bsicos da programao e como se aprofundar no assunto. Visa dar uma idia das aplicaes e dos ganhos que podem ser obtidos com o emprego desta nova tecnologia, e em especial como as GPU podero ser usadas como placas aceleradoras de softwares amplamente usados como matlab, octave, scilab, IDL e GDL por exemplo, evitando-se as complexidades da programao em CUDA.

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

1. Introduo

Nas ltimas dcadas a busca por mais alto desempenho em computao tem se caracterizado por um constante aumento, ao longo dos anos, da frequncia do clock nas Unidades Centrais de Processamento (CPUs). Esse denvolvimento parece ter atingido um patamar de estabilidade em torno dos 3GHZ. Isto se deve a vrias limitaes, como a dissipao trmica, e a limites fsicos para a miniaturizao. Com consequncia disto os principais fabricantes Intel e AMD adotaram j h alguns anos a filosofia de aumentar o nmero de cores numa pastilha de silcio. Assim vimos o surgimento dos Core-duo, Intel Core I3, Intel Core I5 , intel Core I7, dos X2, X4 e X6 seus concorrentes da AMD. A tendncia atual o lanamento nos prximos anos de Processadores multicore. Isto significa que a programao paralela veio para ficar e estar cada vez mais presente na nossa vida. O mercado de jogos, por outro lado levou ao aperfeioamento da placas de video que atualmente so multiprocessadores com centenas de cores, e que podem ser usados para computao em geral, e no somente para computao grfica. Desde 2003 j se usou placas grficas para computao cientfica, mas a programao era muito complexa. Consistia em se mapear o problema em outro matemticamente equivalente, e a placa de vdeo era usada para resolver o problema grfico, cuja soluo era interpretada em termos do problema original, s em 2006 a NVIDIA conseguiu um avano considervel lanando CUDA, que permitia que se programasse usando C e algumas extenses especificas para as placas Nos ltimo anos , especialmente a partir de 2003, as placas de vdeo conseguiram um desenvolvimento espantoso, atingindo velocidades de processamento ordens de grandeza maior do que as CPUs. Isto est mostrado na Figura 1 abaixo

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 1 Operaes de ponto flutuante por segundo para CPU e GPU - Fonte: NVIDIA - Referncia [3]

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Desenvolvimento similar se deu na evoluo da Largura de Banda, e isto est ilustrado na Figura 2 abaixo.

Figura 2 - Largura de Banda para CPU e GPU - Fonte: NVIDIA - Referncia [3]

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

2. Unidade de Processamento Grfico(GPU)

A Unidade de Processamento Grfico (Graphic Processing Unit, ou GPU ) um processador especializado em renderizao de grficos 3D. usada em videogames, computadores pessoais, estaes de trabalho, chegando a estar presente, hoje em dia, em telefones celulares como o Apple iPhone e equipamentos portteis de multimdia como o Microsoft Zune HD [13]. Criadas inicialmente para processar apenas grficos de videogames ou de computadores, as GPUs possuem diversas outras funes importantes. Devido a este propsito inicial, so bastante poderosas e eficientes para manipular grficos computacionais em operaes como adio de efeitos de iluminao, suavizao de contornos de objetos e criao de imagens. As GPUs recebem os objetos vindos da CPU (Central Processing Unit - Unidade Central de Processamento), as transformam, segundo informaes tambm advindas da CPU e geram as imagens que o usurio v na tela [17]. Seu alto poder de processamento paralelo a torna, muitas vezes, mais eficiente do que as CPUs para uma vasta gama de algoritmos complexos que so melhor resolvidos por algoritmos paralelos, como por exemplo na otimizao de algoritmos genticos [22], principalmente quando a quantidade de dados a ser processada muito grande. Alm da facilidade de processar imagens, a GPU tambm usada em clculos matemticos e geomtricos complexos, devido a sua capacidade de processar vetores ou matrizes com extrema facilidade. Essa grande velocidade e poder para clculos matemticos vem do fato das GPUs modernas possurem muito mais circuitos para processamento que para caching de dados e controle de fluxo que as CPUs, como mostra a figura 3.

Figura 3. Comparao do nmero proporcional de transistores em uma CPU e uma GPU modernas.Fonte: NVIDIA - Referncia [3]

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

As GPUs utilizam um maior nmero de transistores para conseguir colocar mais ALUs (Arithmetic Logic Unit) numa pastilha de silcio. Essas ALUs so mais simplificadas do que nas CPUs. Isto permite fazer um maior nmero de clculos ao mesmo tempo, mas implica num controle de fluxo mais simples:As GPUs so feitas para aplicaes paralelas onde as mesmas operaes so aplicadas sobre um grande conjunto de dados.

Tabela Comparao de algumas caractersticas das CPUs e das GPUs CPU - Prpria para tarefas sequenciais - Cache eficiente - Maior quantidade de memria principal - Controlede fluxo - Nmero de cores de 1 ordem de grandeza - 1, 2 threads por core GPU - Prpria para tarefas com paralelismo de dados - Mltiplas ULAs - Maior (capacidade) operaes de ponto flutuante por segundo - Alto throughput de memria - Dezenas de multiprocessors - Mltiplas threads por multiprocessor

Em computadores pessoais, uma GPU pode estar presente na forma de placa de vdeo ou embutida na prpria placa-me, usualmente chamada de on-board. Devido a no terem necessidade especfica, mais de 90% dos usurios de computadores possuem GPUs integradas placa-me, as quais so menos poderosas que placas de vdeo dedicadas. Sua primeira funo foi de processar clculos com ponto flutuante, com o tempo, foi descoberta sua facilidade para processar imagens, visto que imagens so matrizes de nmeros, onde cada nmero se transforma em um pixel. Para usurios comuns, a GPU responsvel pela qualidade grfica do dispositivo, seja ele um computador, um video game ou at mesmo um celular [20]. As GPUs possuam uma funcionalidade fixa para renderizao de grficos, ou seja, o programador s tinha a possibilidade de enviar os objetos a serem renderizados e a placa somente os desenharia. As placas de vdeo eram dispositivos simples, que se limitavam a mostrar o contedo da memria de vdeo no monitor. Com o decorrer do tempo, essa tecnologia evoluiu, sendo introduzidos estgios programveis dentro do pipeline de renderizao das GPUs, dessa forma, os programadores poderiam personalizar a forma como os objetos seriam renderizados. Hoje, devido a alta programabilidade, as GPUs so usadas para vrios tipos de pesquisas, como mdicas, qumicas, matemticas, geogrficas, e at em clusters, devido a seu alto grau de paralelismo [12]. Antes de tudo, devemos diferenciar os componentes para esclarecer quaisquer dvidas: a placa de vdeo o perifrico responsvel por gerar e enviar imagens para os monitores. Enquanto a GPU, a memria e outros componentes so encarregados de lidar com os dados a serem processados, os painis de sada (como a VGA - Video

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Graphics Array, conhecida por sua tradicional cor azul - e a DVI - Digital Visual Interface, a sada digital) so os responsveis pela transmisso das imagens da placa tela [19]. Nosso objetivo mostrar como a programao em GPU modificou-se no decorrer desta evoluo. Sendo assim, iremos apresentar a histria da evoluo das GPUs, fazendo um paralelo com as possibilidades de programao em cada uma das etapas da histria da evoluo das GPUs.
A Tabela 1 abaixo ilustra o desenvolvimento cronolgico das placas de Vdeo e o aumento do nmero de transistores, e do nmero de cores de 1997 at 2009

Tabela 1 Evoluo da tecnologia das placas de Vdeo de 1997 at 2009

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A Nvidia tem trs famlias mais recentes de placas grficas, Exemplificadas pelas GT8000, pelas GT280 e pelas GTX480 (Fermi - com chip GF100). A Tabela 2 abaixo ilustra as principais caractersticas dessas placas
Tabela 2 - Principais caractersticas das trs famlias mais recentes de placas da

NVIDIA

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A Capacidade de computao (Compute capability) fornece uma medida da capacidade de clculo cientfico das placas de vdeo e a Tabela 3 esquematiza a evoluo disto

Tabela 2 Principais caractersticas da Capacidade de Computao. Fonte: NVIDIA - Referncia [3]

As Tabelas 4 e 5 indicam qual a Capacidade de computao de um grande nmero de placas modernas da NVIDIA

10

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Tabela 4 Lista de placas de vdeo de capacidade de computao 1.X Fonte: Wikipedia - Referncia [7]

Tabela 5 Lista de placas de vdeo de capacidade de computao 2.X Fonte: Wikipedia - Referncia [7]

11

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A Placa de Video GTX550TI usada no Cluster de GPUs do CPTEC/DSA, uma des melhores em termos de custo beneficio, embora a Placa topo de Linha apresente um desempenho quase que duas vezes superior, como ilustrado nos dois grficos abaixo, tirados do site speckmarks, acessado em 19 de setembro de 2011

Figura 4 Placas de vdeo de maior pontuao no Passmark Fonte: Passmark Referncia [21]

Figura 5 Placas de vdeo de melhor relao custo/benefcio. Fonte: Passmark Referncia [21]

Do exame da figura 5, vemos inclusive que a GTX55TI a placa de video da NVIDIA com melhor custo/beneficio. Tem tambem a vantagem de ser muito moderna, tendo sido lanada no mercado em maro de 2011, e de arquitetura FERMI, e com computability 2.1.

12

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

3. Construo de um Cluster de GPUs na DSA/CPTEC/INPE


Foi instalado na Diviso de Sistemas Ambientais do CPTEC/INPE, no segundo semestre de 2011 um cluster de GPUs com oito ns, montado por pesquisadores da DSA, a partir de componentes "off the Shell" encontrados no mercado, de baixo custo. Trata-se do primeiro cluster de GPUs instalado no INPE. Foram usados entretanto processadores Intel de ltima gerao, Core I7 2600 e Placas de Vdeo de Arquitetura Fermi, ultra modernas,que foram lanadas no mercado em maro de 2011. Estas placas so as placas da NVIDIA que apresentam atualmente melhor razo custo/benefcio.A figura 6 abaixo ilustra algumas das caractersticas de vrias placas, e os preos no mercado (preos tpicos de mercado atualizados em 27 de setembro de 2011)

Figura 6 - Algumas das caractersticas de vrias placas de vdeo , com preos tpicos de mercado atualizados em 27 de setembro de 2011

Optar por uma placa mais potente como a GTX580, significaria, para cada um dos ns um custo de investimento na placa muito maior, necessidade de comprar uma fonte de alimentao muito mais cara, necessidade de mais potencia disponivel para operao e refrigerao, isto no nosso caso ampliao das instalaes existentes, e alm disto uma custo de operao (conta de luz) bem mais elevada.

13

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

O cluster foi adquirido com recursos do Projeto Universal do CNPq intitulado "Estudo da precipitao usando microondas passivas", que nasceu de uma colaborao ente o INPE, a FUNCEME e a Universidade Estadual do Cear O objetivo do cluster dar apoio as atividades de pesquisa no mbito deste Projeto Universal, mas devido a sua grande capacidade de clculo, poder atender todos os Integrantes e alunos da DSA, em atividades da DSA, principalmente em Projetos de Desenvolvimento e Pesquisa O cluster poder de servir de plataforma para desenvolvimento de programas paralelos e contribuir para a disseminao da programao de GPUs, usando CUDA, entre os elementos da DSA, e dar apoio para a formao de recursos humanos familiarizados com essas novas tecnologias de programao Pretende-se fomentar a busca de solues de programao paralela de baixo custo e alto desempenho que sejam adequadas a aplicaes em Meteorologia e processamento de imagens de radar, e de satlite. O impacto dessas novas tecnologias de computao promete ser enorme, em Meteorologia e vrias outras reas como Seismologia, Mecnica dos Fluidos, Processamento de Imagens, Finanas, Engenharia Biomdica, Radioterapia, Dinmica Molecular e at mesmo finanas, para citar apenas algumas. Especial ateno ser dada ao uso da GPU como dispositivo acelerador de software livre para clculo cientfico como Octave e Scilab ( substituto do Matlab) e GDL ( substituto do IDL). Sistemas com GPU permitem obtermos a mesma capacidade de clculo de sistemas convencionais, porm a um dcimo, ou menos do custo dos sistemas convencionais baseados em CPUs, e com um consumo de energia da ordem de 20 vezes menor, em operao plena. A configurao de cada n do Cluster de GPUs da DSA a seguinte: Processador Intel Core i7 2600 (I7 de segunda gerao) 8 GB de memria RAM 1 Tb de disco rgido Fonte de Alimentao 500W Reais Uma GPU (Placa de Vdeo da NVIDIA) de arquitetura FERMI, GTX550TI. O sistema operacional Linux Ubuntu 10.04 (LTS)

Cada GTX550TI pode fornecer 0.692 GFlops, e consome, isoladamente 116 Watts, O consumo total do Cluster no deve ultrapassar os 3200 Watts. A potncia mxima terica do Cluster de 5.6 TeraFlops, o que no desprezvel. Para comparao, o Supercomputador Cray 1 tinha apenas 80 Mflops, e o supercomputador do CPTEC anterior ao Tup, chamado de UNA abrigava 1000 CPUs e apresentava uma potncia mxima terica de 5 TeraFlops.

14

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A tecnologia CUDA encarada por muitos cientistas como o advento de uma verdadeira revoluo na Computao Cientfica, e abre tambem um novo captulo, o da Supercomputao pessoal, alm do impacto na computao de mais alto desempenho. Estima-se que dentro de poucos anos todos os computadores que figuram da lista semestral dos TOP500 sejam de mquinas baseadas em GPUs. Os oito ns esto interconectados por meio de uma rede Gigabit, e podem ser usados isoladamente ou em conjunto como um cluster, usando mpich2. Cada n pode suportar 8 processos MPI, perfazendo um total de 64 processos, os nst individualmente podem ser acessados por meio de um KVM, no local onde est o cluster, ou a partir de qualquer PC conectado a rede da DSA, ou por VPN.

15

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

4 . Configurao de Driver NVIDIA para GPU, CUDA Toolkit 4.0 e SDK em Linux Ubuntu 10.04 no CPTEC

Damos a seguir uma sequncia detalhada de passos que foram seguidos para a instalao da placa de video, e do software CUDA, que podem ser seguidos para quem estiver interessado em fazer um sistema semelhante para seu prprio uso.

Fizemos uso de um tutorial, que pode ser encontrado na URL abaixo http://ubuntuforums.org/showthread.php?t=1625433 http://gpubrasil.com/2010/05/12/instalacao-do-cuda-3-0-no-ubuntu-10-04/#more-303, traduzindo-o e adaptando-o, com o objetivo de organizar e documentar a instalao de um pequeno cluster de 8 GPUs GTX550TI que foi construdo na DSA/CPTEC/INPE, no segundo semestre de 2011, bem como servir de guia para outras instalaoes semelhantes

Como Instalar Nvidia CUDA 4.0 in Ubuntu 10.04

O tutorial seguinte descreve como instalar Nvidia CUDA em Ubuntu 10.04 LTS. Os passos seguintes supem que tenhamos um sistema recentemente instalado com Linux Ubuntu 10.04 - 64 bit. No foi testado em 32 bits, mas provavelmente funcionar tambm. H problemas quando se tenta instalar CUDA 3.1 em Ubuntu 10.04. CUDA 3.1 s funciona com Ubuntu 9.10. Este tutorial foi feito originalmente para CUDA 3.2RC2 em Ubuntu 10.04, porm foi adaptado para instalar CUDA 4.0.17 em Ubuntu 10.04, num sistema com as seguintes caracteristicas: Placa-Me ECS 2h61h2-m2 Rev3.0, Processador Intel Core I7 2600, 8 GB de memria RAM, Placa de Vdeo GTX550TI, fonte de alimentao C3Tech VE 500 Watts reais. Posteriormente tambm funcionou em outra configurao descrita abaixo Placa-Me ASUS M4n68t-m Le Onboard Am3 , Processador AMD Phenom X6 1075THexacore, 8 GB de memria RAM, Placa de Vdeo GTX550TI, fonte de alimentao C3Tech VE 500 Watts reais. Escolhemos Ubuntu10.04 por que uma distribuio LTS ( Long Term Support). Este tutorial no funciona com Ubuntu 11.04 1. Baixe o driver Nvidia e CUDA: V para a pgina da Nvidia

16

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

http://developer.nvidia.com/cuda-toolkit-archive Usamos a verso 4.0.17 do Toolkit e o driver 270.41.19 de maio de 2011 para Linux que eram os mais recentes no momento em que montamos as maquinas (julho de 2011) Baixe os arquivos seguintes: "Developer Drivers for Linux (270.41.19)" (64 bit). "CUDA Toolkit 4.0.17 para Ubuntu Linux 10.04" (64 bit). "GPU Computing SDK code samples". Opcional - este software ser usado apenas para verificao e como auxlio a desenvolvedores em CUDA 2. Primeiramente elimine quaisquer drivers que existam no seu sistema e que podem interferir com o driver de desenvolvimento da NVIDIA (seguindo sugesto encontrada em http://ubuntuforums.org/showthread.php? p=9233555): 2.1. Coloque na lista negra (blacklist) os seguintes modules: Digite:
sudo gedit /etc/modprobe.d/blacklist.conf

Acrescente as seguintes linhas ao arquivo: Digite:


blacklist blacklist blacklist blacklist blacklist vga16fb nouveau rivafb nvidiafb rivatv

Salve e saia do editor. 2.2. Elimine quaisquer drivers da Nvidia que tenham sido instalados anteriormente: Digite:
sudo apt-get --purge remove nvidia-*

3. Reinicialize o PC. 4. V para um terminal virtual (ser necessrio desligar o X server): Digite:
CTRL+ALT+F5

Se voc encontrar problemas , busque auxlio em http://ubuntuforums.org/showthread.php?t=1473045. 5. Login no terminal e execute: Digite:
sudo service gdm stop

17

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

6. Instale os drivers de desenvolvimento da Nvidia: 6.1 - V para o diretrio onde foram guardados os arquivos baixados do site da NVIDIA e execute:

Digite:
sudo devdriver_3.2_linux_64_270.41.19.run

6.1.1- Aceite os termos da licena. 6.1.2 -Install NVIDIA's 32-bit compatibility OpenGL libraries? Responda 'Yes' 6.1.3 -Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X driver will be used when you restart X? Responda 'Yes'. Isto habilita seu sistema a fazer grficos usando OpenGL, e configura automaticamente o NVIDIA X server 7. O driver deve estar instalado agora corretamente. O prximo passo instalar CUDA: 7.1. V para o diretrio onde foram guardados os arquivos baixados do site da NVIDIA e execute: Digite:
sudo cudatoolkit_4.0.17_linux_64_ubuntu10.10.run Isto funcionou em Ubuntu 10.04, embora o arquivo j seja para Ubuntu 10.10

Enter install path (default /usr/local/cuda, '/cuda' will be appended): Aperte enter para selecionar o caminho padro ou escolha outro local - este tutorial supe que sejam escolhidos os caminhos padro.

7.2 Edite o arquivo /etc/profile para utilizar CUDA adicionando ao final do arquivo:
#### CUDA Settings #### # Toolkit/SDK export PATH=$PATH:/usr/local/cuda/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib

7.3. Se o sistema for de 64 bits, descomentar a linha abaixo:

18

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

8. Ajuste as variavis de environment: 8.1. Ajuste e PATH: Digite:


sudo gedit /etc/environment

Acrescente o caminho dos binrios de CUDA binaries. Mude a linha Digite:


PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ sbin:/bin:/usr/games"

para que fique assim Digite:


PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/ sbin:/bin:/usr/games:/usr/local/cuda/bin"

Salve e saia do editor. 8.2. Recarregue o PATH: Digite:


source /etc/environment

8.3. Configure LD_LIBRARY_PATH: Digite:


sudo gedit /etc/ld.so.conf.d/cuda.conf (creates a new file).

Cole no arquivo o seguinte: Digite:


/usr/local/cuda/lib64 /usr/local/cuda/lib

Salve e saia do editor. 8.4. Recarregue LD_LIBRARY_PATH: Digite:


sudo ldconfig

9. CUDA est agora instalado e pronto para funcionar. Caso se deseje, pode ser agora instalado o "GPU Computing SDK" e feita a compilao dos exemplos para verificar se a instalao

19

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

est funcionando corretamente. 9.1. V para o diretrio onde foram guardados os arquivos baixados do site da NVIDIA e execute: Digite:
gpucomputingsdk_4.0.17_linux.run

1. Enter install path (default ~/NVIDIA_GPU_Computing_SDK): Aperte enter para selecionar o caminho padro ou escolha outro lugar - este tutorial supe que voc faa a escolha padro 2. Localizado CUDA em /usr/local/cuda Aperte enter para confirmar. 9.2. Instale o compilador: Digite:
sudo apt-get install g++

Do you want to continue [Y/n]? Aperte enter para instalar as dependncias. 9.3. Conserte o link quebrado para libGL.so (http://ubuntuforums.org/showthread.php?t=409438): 3.1 Digite:
sudo rm /usr/lib/libGL.so sudo ln -s /usr/lib/libGL.so.270.41.19 /usr/lib/libGL.so 3.2 Digite: cd /usr/lib sudo ln -sf libGL.so.1 libGL.so

9.4. Crie um link para libXmu.so: Digite:


sudo ln -s /usr/lib/libXmu.so.6 /usr/lib/libXmu.so

9.5. Instale as bibliotecas necessrias para compilar os exemplos de CUDA : Digite:


sudo apt-get install freeglut3-dev libxi-dev

Do you want to continue [Y/n]? Aperte Y enter para instalar as dependncias. Reinicialize seu computador ( reboot) 9.6. V para o diretrio NVIDIA_GPU_Computing_SDK/C Digite:
cd ~/NVIDIA_GPU_Computing_SDK/C

20

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

9.7. Compile os exemplos: Digite:


make

10. Os exemplos compilados podem agora ser encontrados em ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/

21

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

5. Movimentaes de dados e modelo de memria Um computador com GPU, pode ser visto como um sitema composto de um hospedeiro(CPU + memria) e de um dispositivo (GPU+ memrias)

A Figura 7 abaixo ilustra as relaes entre CPU e GPU, suas memrias principais e as velocidades de transferncias dos dados. O PCI-e, verso 3 tem velocidade que atinge os 8 GB/s

Figura 7 Esquema mostrando as relaes entre CPU e GPU, suas memrias principais e as velocidades de transferncias dos dados

22

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Sistemas modernos tem hospedeiros que usam CPUs multicores, e uma ou vrias GPUs na mesma placa me. As memrias usadas podem ser DDR3 at DDR5 nas placas de Vdeo, como mostrado esquematicamente na Figura abaixo

Figura 8 - Representao esquemtica de um sistema com duas CPUs quadcore com memria compartilhada DDR3 e com uma placa grfica com memria DDR5 Fonte: Miles, Referncia[24]

A mmria do hospedeiro uma memria complexa, com vrios nveis de hierarquia, como exemplificado na figura 9 abaixo

23

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 9 - Representao esquemtica da memria do hospedeiro. Fonte: Miles, Referncia[24]

Na CPU, a velocidade de execuo depende de sabermos explorar a localidade temporal

e espacial dos dados. Na localidade temporal: um dado que acabou de ser acessado tem grande probabilidade de ser acessado novamente em futuro prximo. Assim devemos guard-lo no cache. Na localidade espacial dados armazenados bem prximos, tm tambm alta probabilidade de serem usados em futuro prximo. Assim devemos coloc-los no cache. Isto a nica maneira de aumentar efetivamente a largura de banda da memria principal, que lenta.

Hardware das diversas famlias de GPUs da NVIDIA Em 2006 a VNIDIA lanou a srie G80, em 2008 surgiu a srie GT200, e em 2010 surgiu a arquitetura Fermi, das placas GTX 4xx e mais recentemente em 2011 das placas GTX 5xx, de segunda gerao, que tem mais eficincia em termos de Gflops/Watts.

O bloco bsico de contruo o streaming processor(SP). Um nmero determinado de SP compes um Streaming Multiprocesso (SM). Placas diferentes tem nmeros diferentes de SP e SM. Na Tabela abaixo resumimos as caractersticas de algumas das placas de vdeo mais representativas das trs arquiteturas da NVIDIA.Pode-se verificar fcilmente o aumento impressionante do numero de cores, e da bandwidth, bem como um pequeno aumento das memrias dos dispositivos, ao longo dos anos.

24

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Tabela 6 - Caractersticas principais de algumas das placas mais representativas das trs arquiteturas da NVIDIA.Fonte: Adaptado de Miles, Referncia[24]

As GPUs podem ser vistas como processadores massivamente paralelos de Threads. O nmero de Threads pode ser muito superior ao numero de cores. Uma caracterstica fundamental das GPUs so as vrias memrias que possuem : As mmorias do dispositivo so as memrias Global, Compartilhada, Local , Constante, Textura, Superfcie.

O dispositivo (GPU) tem centenas de unidades de processamento (cores), e uma estrutura complexa de memrias e d suporte a clculos para exibiao de grficos e mais recentemente est sendo utilizado para clculos cientificos usando paralelismo massivo.

25

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A figura 10a, abaixo mostra esquematicamente uma GPU da primeira famlia G80 Vemos 8 SM, cada qual com 16 SP, perfazendo um total de 128 cores. Esta uma GPU tpica de 2007, da primeira famlia

GT8088

Figura 10a Representao esquemtica de uma GPU da primeira famlia G80 Fonte : Referencia Cooper[18]

26

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A figura 10b, abaixo mostra esquematicamente uma GPU da familia GT200 Esta uma GPU tpica de 2008, da segunda famlia, capaz de uma excelente desempenho em preciso simples. Tipicamente pode-se alcanar, nas melhores placas desta famlia, em preciso dupla, 10% da velocidade de clculo em preciso simples. A capacidade de cculo pode chegar a 1.3 mas nunca a 2.1 ou 2.2. Vemos, na Figura 10b, 30 Stream Multiprocessors ( SM), cada qual com 24 Thread Processor ( TP ou SP), perfazendo um total de 240 cores. Tipicamente podemos ter 240 processadores (cores) em 1.3 GHz oferecendo uma potncia de pico terica de 930 Gflops.Exemplos desta famlia so a GTX 285, que pode fornecer 1062 Gflops, com um consumo de 204 Watts e a GTX 295 ( na realidade uma dupla 285 com 480 cores, que pode fornecer 1788 Gflops, com um consumo de 289 Watts

GT285

Figura 10b Representao esquemtica de uma GPU da famlia GT200 Fonte : Referncia Oberhuber et al.[25]

27

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A figura 10c, abaixo mostra esquematicamente uma Gpu moderna de arquitetura Fermi. Esta tem 14 SM, cada qual com 32 SP, perfazendo um total de 448 SP, portanto um nmero muito maior de SPs do que o nmero tpico as duas outras famlias. tipica das terceira famlia, j com capacidade de computao 2.0 ou 2.1 e um desempenho muito maior em preciso dupla, aproximadamente a metade do que se consegue em preciso simples Por exemplo uma GTX 580 , que foi lanada em Novembro de 2010, tem 16 SM com 32 ST cada, perfazendo 512 cores, e pode oferecer 1581 Gflops, com um consumo de 244 Watts

GTX560

Figura 10c - Representao esquemtica de uma GPU moderna de arquitetura Fermi Fonte: Miles, Referncia[24]

28

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

6. CUDA

Vejamos inicialmente o que CUDA: CUDA significa Compute Unified Device Architecture. uma arquitetura de computao paralela desenvolvida pela NVIDIA. Ela se destina a utilizar o poder computacional das GPUs fabricadas pela NVIDIA. CUDA tambm uma extenso da linguagem C, que permite o uso dessas GPUs, dando suporte a uma hierarquia de grupos de threads, permitindo a definio dos threads que so executados nas GPU.CUDA tambm possui uma API com funes , que permitem o gerenciamento da memria da GPU e outros tipos de controle. CUDA pode ser obtido gratuitamente so site da NVIDIA: <http://www.nvidia.com/object/cuda_get.html> Est disponvel para Windows XP, Windows Vista e Windows 7, Linux e MacOS X, em verses para 32 e 64 bits O pacote completo composto de trs partes: 1 - CUDA Driver que gerencia o Hardware 2 - CUDA Toolkit que prov as ferramentas e bibliotecas para programao em CUDA tais como compilador, depurador, bibliotecas bsicas 3 - SKD Software Development Kit que tem exemplos de cdigos, makefiles, muito til para o aprendizado, contendo cerca de 50 aplicaes. A NVIDIA tem comercializado GPUs que so o estado da arte na implementao de Stream Processors, tratam-se das novas placas grficas a partir das sries 8, Tesla e algumas Quadro. A nova tecnologia apresentada pela NVIDIA vem acompanhada de um novo modelo de arquitetura e programao chamado CUDA (Compute Unified Device Architecture). A pilha de software (Mostrada na Figura 11) do CUDA, envolve uma API com suporte direto a diversas funes matemticas, primitivas de computao grfica, bibliotecas, suporte ao runtime e ao driver, que otimiza e gerencia a utilizao de recursos diretamente com a GPU. Inicialmente, os processadores destas placas no eram flexveis, atendendo apenas mercados restritos (jogos e aplicaes 3D) e, com o tempo, foram se tornando Stream Processors, cada vez mais flexveis e programveis.

29

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 11 - Fonte: NVIDIA - Referncia [3] Um dos pontos que podem causar preocupaes futuras que CUDA uma arquitetura propritaria e exclusiva das placas de vdeo fabricadas pela NVIDIA. Uma placa dessas pode ser usada para sua finalidade original, que fazer o processamento necessrio para a produo de grficos de alta qualidade, mas tambm pode ser usada para a realizao de clculos numricos intensivos, onde seu desempenho superbo, superando ai o desempenho das CPU em ordens de magnitude. Uma placa de video utilizada com este fim, por ser vista como um processador paralelo de centenas milhares de threads. Cada thread um programa que roda dentro da GPU, a qual tem centenas de cores, e uma estrutura complexa de memria. Placas de vdeo de outros fabricantes, como a AMD, no funcionam com CUDA. Existe uma alternativa a CUDA, que o OpenCL, que foi desenvolvida para funcionar com GPU de qualquer fabricante. muito parecida com CUDA, e tem o apoio de vrios fabricantes, inclusive da prpria NVIDIA. O OpenCL funciona em placas de Video fabricadas pela NVIDIA, e tambm da AMD, porm no momento atual, CUDA est muito mais desenvolvida, especialmente no que se refere bibliotecas matemticas e software em geral do que OpenCL. Outra considerao importante, que no caso do OpenCL, por ele ser mais geral, fica mais difcil ter o mesmo desempenho de CUDA, que j leva em conta as caractersticas especificas do Hardware, no caso das as placas da NVIDIA. Esta entretantno uma rea onde novos desenvolvimentos esto sendo anunciados muito frequentemente e muitas novidades esto para aparecer nos prximos anos.

30

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Modelos de Threads em CUDA Os Threads esto agrupados em Blocos e os Blocos esto agrupados em Grades. Cada grupo de 32 threads forma um Warp, que constituem um grupo de threads com caractersticas especficas para efeitos de execuo. Cada Cuda Thread tem acesso privado memria local, reservado na inicializao do bloco. Isto est ilustrado pela Figura 12 abaixo Na arquitetura Fermi um arquivo com 128KB registros e dividido entre todos os threads residentes.

Figura 12 -Fonte: Thomadakis[12]

/* no kernel */ float Lfloat; double Ldouble; ...

Cada Bloco de Thread tem acesso privativo a uma quantidade configurvel de memria scratch-pad (bloco de rascunho) Na arquitetura Fermi cada SM tem 64 KB SRAM que podem ser configurados como 16 KB L1 cache + 48 KB scratch-pad, ou 48 KB L1 cache + 16 KB scratch-pad O espao disponvel de scratch-pad particionado entre blocos residentes de threads blocks

31

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 13 -Fonte: Thomadakis[12]

/* in kernel */ __shared__ float Sfloat; __shared__ double Sdouble; ...

Modelo de memria global em CUDA Os blocos de threads em todos os Grids compartilham o acesso a uma larga reserva de memria Global (GM) separada da memria principal do hospedeiro (CPU) GM Esta memria GM retm o estado persistente da aplicao, enquanto a parte local de threads e as memrias locais dos blocos so temporrias. Na arquitetura Fermi, GM tem um cache de 768 KB compartilhado num cache L2. A memria GM muito mais cara do que as memrias no chip: Blocos de Threads (Tbs) em todas as Grids compartilham acesso a uma grande reserva de memria Global. /* in kernel */ __device__ float Gfloat; __device__ double Gdouble;

Figura 14 -Fonte: Thomadakis[12] Cada dispositivo Cuda tem sua prpria memria global separada da memria da CPU. Esta memria alocada ou liberada por meio da instruo cudaMalloc() cudaFree() respectivamente. A tranferncia entre memria do dispositivo para a memria do hospedeiro feita por meio da instruo cudaMemcpy()

32

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Isto realizado atravs do PCIe bus, que tem baixa bandwidth e latncia alta. Mltiplos dispositivos GPU so controlados por mltiplos threads da CPU

Tabela 7 - CUDA Variable Type Qualifiers

__device__ opcional quando usado com __local__, __shared__, ou __constant__ Variveis automticas sem alguma qualificao ficam num registro, com a exceo de arrays que residem na memria local.

Visualizao lgica das memrias CUDA

33

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 15 -Fonte: Thomadakis[12] Vejamos o uso combinado da arquitetura CPU e GPU

A figura abaixo ilustra esta arquitetura heterognea, composta de um hospedeiro contendo uma CPU e um dispositivo, contendo uma GPU. O hospedeiro contm alm da CPU, uma memria principal, uma ou vrias memrias chche e uma ponte de E/S e est conectada ao dispositivo por meio de um bus PCI-e. A GPU contm uma memria do dispositivo, uma memria cache e vrios processadores que possuem cada um uma memria compartilhada (SMEM) e vrios processadores (cores). Este um sistema com uma arquitetura heterognea, e necessrio que usemos o processador certo e a memria certa para cada tarefa. A CPU excelente para executar umas poucas threads seriais, tendo execuo rapida e sequencial, baixa latncia no acesso a memria cache A GPU excelente para executar muitas threads em paralelo, sendo caracterizadas por grande escalabilidade e alta largura de banda no acesso memria paralela O kernel CUDA mapeado em Grades de blocos, atravs do comando kernel_func<<<nblk, nthread>>>(param, ); A figura 16 abaixo ilustra uma thread no hospedeiro e uma grade de blocos de threads sendo executada no dispositivo (GPU)

34

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 16 -Fonte: Thomadakis[12]

E a grade executada na GPU, como mostrado esquematicamene na Figura 17 abaixo

Figura 17 -Fonte: Thomadakis[12]

35

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

7.Arquitetura de uma placa de video moderna, de arquitetura Fermi

A mais moderna das geraes de placas de video da NVIDIA aquela das placas de arquitetura Fermi, baseadas nos chip GF100/104/106 e 108, correspondentes s placas da srie 400, e sua segunda gerao, baseada nos chips GF110/114/116/118, da srie 500. A arquitetura Fermi, foi lanada em 2010 com o Chip GF100, e se caracteriza por algumas melhorias dentre elas a capacidade melhorada para dupla preciso, que atualmente a metade da capacidade em preciso simples, bem como por algumas outras caractersticas que facilitam a programao e melhoram o desempenho, sendo significativa a melhoria para lidar com a soluo de Equaes Diferenciais Parciais, por exemplo. Este chip caracteriza-se por ter 16 Multiprocessadores (SM): 32 processadores (SP) em cada SM 16 unidades Load/Store 4 unidades funes especiais(SFU) 64 kB Memria compartilhada 32768 registradores Cache de constantes e textura

36

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A Figura 18 abaixo ilustra como um chip GF100, e mostra os seus 16 SM de maneira esquemtica.

Figura 18 - Fonte: Thomadakis[12]

37

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Vejamos alguns detalhes das GPUs modernas de arquitetura Fermi. A Figura 19 abaixo ilustra como so os detalhes de um SP de GPU Fermi de 2a.gerao

Figura 19 -Representao pictrica de um SP e onde est localizado num SM Fonte: Thomadakis[12]

Caractersticas da Placa GTX550 TI. Por vrios motivos esta placa merece aqui algum destaque. A NVIDIA lanou em 15 de maro de 2011 esta placa GeForce GTX 550 Ti (Ti significa Titnio),uma placa de vdeo dentro da srie GeForce GTX 500. A placa trabalha internamente a 900 MHz, tem 1 GB de memria GDDR5 rodando a 4.100 MHz DDR atravs de uma interface de 192 bits, 192 processadores rodando a 1.800 MHz, e conectores DVI e mini-HDMI.

38

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A GeForce GTX 550 Ti foi lanada no mercado norte-americano custando US$ 149,99, um preo bastante reduzido para o lanamento, e hoje esta ainda mais barata. Vrios fabricantes como ASUS, Colorful, EVGA, Gainward,Galaxy, Inno3D, KFA2, MSI, Palit, Point of View, PNY, Sparkle e ZOTAC, lanaram modelos baseados nesta nova placa de vdeo da NVIDIA. uma placa das mais modernas, tem arquitetura Fermi, de 2a.gerao tendo capacidade de computao 2.1 Ela . dentre as placas de sua gerao da NVIDIA, at agora ( outtubro de 2011 ) a placa que apresenta melhor custo benefcio e um baixo custo, cerca de R$430,00 no Brasil, legalizada. Consome relativamente pouca potncia ( 116 W) sendo possvel usa-la com uma fonte de 400 W reais, embora seja aconselhado que se utilize uma fonte de alimentao pel menos com de 500 W reais, que custa hoje cerca de R$ 140,00 ou pouco mais. portanto uma forte candidata para algum que queira montar seu prprio sistema e comear a estudar CUDA, e entrar no mundo do clculo cientfico usando paralelismo em GPUs. A figura 20 abaixo mostra uma foto de uma GTX550 TI

Figura 20 - Foto de uma GTX550 TI, da ZOTAC

Ela se baseia no chip GF116, com 4 SM cada qual com 48 SP, perfazendo um total de 192 cores, Possui tambm 4 Polymorph engines, e 32 unidades para Textura. Portanto da classe da NVIDIA GTS 450, mas a NVIDIA afirma que tem 70 % a mais de bandwidth uma performance 28% mais alta e um custo de operao 205 menor em termos de Watts/GFlops. Bsicamente tem , para grficos uma performance comparvel a da concorrente da AMD a Radeon HD 5770, mas oferece a possibilidade de usar o que hoje existe de mais moderno em termos de CUDA, para aplicaes cientficas, tendo em vista a razo custo benefcio. No mercado americano custa atualmente menos de 120 dlares.

39

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Pode fornecer 692 Gflops. Foi a placa de vdeo escolhida para o primeiro cluster de GPU do CPTEC/INPE.

Memrias do dispositivo (GPU)

Uma GPU tem uma estrutura de memrias bastante complexa, e para otimizarmos um program e podermos obter o mximo de desempenho de uma GPU necessrio um perfeito conhecimento das carctersticas, do funcionamento e como deve ser o uso dessas memrias. talvez a parte mais dura da programao em CUDA. As Figuras 21 e 22 abaixo se referem aos vrios tipos de memrias com as quais lidamos ao trabalhar com GPUs. A a Figura 21 agrupas os nomes usados, e a Figura 22 apresenta um resumo ds principais caracteristicas dos vrios tipos de memris. Incluidos ai tambm esto os registradores, que so rpidos porm escassos

Figura 21 Definies da memrias de vrios tipos

40

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 22 Localizao e caracteristicas dos registradores e das memrias

Considere, para exemplificar, um dispositivo com uma grade com dois blocos de duas threads cada, como mostrado na Figura 23. Cada thread tem seus Registros e sua memria local, e todas as threas de um bloco podem acesar uma memria compartilhada. Mas as threads de um bloco no tem acesso memria compartilhada do outro bloco. Porm todas as threads de todos os blocos tm acesso a memria global, que a mais lenta dessas mencionadas. Existe a possibilidade de comunicao entre as memrias do dispositivo e a do hospedeiro, mas isto passa pelo gargalo do PCI-e sendo extremamente lento, se comparado com os tempos caractersticos para as transaes de dados entre as memrias dentro do dispositivo. A figura 23 abaixo mostra tambm de maneira esquemtica a posico dessas vrias memrias e como elas esto organizadas na Placa de Vdeo (device)

41

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 23 Posico de vrias memrias da Placa de Vdeo e como elas esto organizadas

42

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

8. Modelo de execuo: threads, blocos, warps e grids Threads so executadas por cores Um Warp so 32 threads Um bloco consiste de conjuntos de warps Um Warp executado em paralelo(SIMT) em um Multiprocessor Um Kernel lanado como um grid Um grid executado no device

A figura 24 abaixo ilustra os conceitos de threads, blocks,grids e warps, e sua realao com a CPU (core), o dispositivo (GPU) e os multiprocessadores de um dispositivo e seus mltiplos cores

Figura 24 Ilustrao dos conceitos de threads, blocks,grids e warps, e sua relao com os cores e o dispositivo (device) - Fonte: NVIDIA - Referncia [22]

43

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

A figura 25 abaixo ilustra o funcionamento esquemtico de um programa simples, no qual uma parte roda no hospedeiro (CPU) e outra parte consiste em vrios threads que rodam no dispositivo (GPU), e as etapas do fluxo de um programa com a cpia de dados da CPU para a GPU e no final da copia dos resultados da GPU para a CPU

Figura 25 Fluxo de processamento em CUDA - Fonte: Wikipedia[7]

44

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

9 . Programao CUDA C Para aprender a programas em CUDA fundamental estudar o NVIDIA_CUDAProgramming_Guide_4.0, Ref [3], e estudar com afinco os exemplos disponveis no seu computador, depois que se faz a instalao do Software Development Kit (SDK). Vejamos um exemplo simples de um programa para somar na GPU dois vetores a e b, tirado de Seland referncia[16] arquivo MatrixAdd.cu // determina o tamanho da grade
const int N = 1024; const int blocksize = 16; // kernel para a computacao __global__ void add_matrix( float* a, float *b, float *c, int N ) { int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * blockDim.y + threadIdx.y; int index = i + j*N; if ( i < N && j < N ) c[index] = a[index] + b[index]; }

int main() { // alocacao da float *a = new float *b = new float *c = new

memoria da CPU float[N*N]; float[N*N]; float[N*N];

for ( int i = 0; i < N*N; ++i ) { a[i] = 1.0f; b[i] = 3.5f; } // alocacao da memoria da GPU float *ad, *bd, *cd; const int size = N*N*sizeof(float); cudaMalloc( (void**)&ad, size ); cudaMalloc( (void**)&bd, size ); cudaMalloc( (void**)&cd, size ); // copia dados para a GPU cudaMemcpy( ad, a, size, cudaMemcpyHostToDevice ); cudaMemcpy( bd, b, size, cudaMemcpyHostToDevice ); // executa o kernel dim3 dimBlock( blocksize, blocksize ); dim3 dimGrid( N/dimBlock.x, N/dimBlock.y ); add_matrix<<<dimGrid, dimBlock>>>( ad, bd, cd, N ); //copia o resultado de volta para a CPU cudaMemcpy( c, cd, size, cudaMemcpyDeviceToHost );

45

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

// limpa e retorna cudaFree( ad ); cudaFree( bd ); cudaFree( cd ); delete[] a; delete[] b; delete[] c; return EXIT_SUCCESS; }

compile da maneira seguinte nvcc MatrizAdd.cu e execute

Vejamos agora um exemplo de programa para clculo do valor de pi. Veremos uma verso serial em Linguagem C, e uma verso do mesmo programa para fazer uso de placas NVIDIA, usando CUDA.

A figura abaixo ilustra as exenses em C que usaremos, para determinar onde ficaro as variveis

Figura 26 Tipos de funes no hospedeiro e no dispositivo - Fonte: Radev Referncia[23]

46

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Na Figura 27 abaixo, vemos o cdigo em Linguagem C, serial, para clculo do valor de pi, usando a tcnica de Monte Carlo. Fonte: Radev - Referncia[23]
int main(){ int c1=0, c2=0; srandom(123); for(int i=1; i<=mcsteps; i++){ double x=rnd(); double y=rnd(); if(x*x+y*y < 1.0) c1++; else c2++; } res = 4.0*(double)c1/(double)(c1+c2); printf("%f\n", res); exit(0); }

Os valores de c1 e c2 usados no programa so o nmero de pontos dentro do crculo, e o nmero de pontos fora dele, mas dentro do do quadrado que circunscreve o circulo, de acordo com a figura abaixo

Figura 27 - Ilustrao do clculo de c1 e c2 ( vide texto ) para determinao do valor de pi, usando-se o mtodo de Monte Carlo. Fonte: Radev - Referncia[23] Como c1 /(c1 + c2) = (rea do crculo) / (rea do quadrado)= (pi *r**2)/ ((2r)**2) O valor de pi calculado como pi = 4,0 * (c1)/(c1 +c2)

47

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Onde aproximamos as reas pela contagem das vzes que um ponto aleatoriamente sorteado contribui para c1 ou c2 Uma verso para GPU deste programa seguinte Fonte: Radev - Referncia[23]
arquivo: picuda.cu int main(int argc, const char **argv){ CUT_DEVICE_INIT(); CUDA_SAFE_CALL( cudaMalloc((void **)&d_Random, RAND_N * sizeof(float))); RandomGPU<<<32, 128>>>(d_Random, N_PER_RNG, 123); CUDA_SAFE_CALL( cudaThreadSynchronize() ); CUDA_SAFE_CALL( cudaMalloc( (void**) &d_odata, mem_size)); PiGPU<<<32, 128>>>(d_Random, d_odata, MT_RNG_COUNT, N_PER_RNG); CUDA_SAFE_CALL( cudaThreadSynchronize() ); CUDA_SAFE_CALL( cudaMemcpy( h_odata, d_odata, sizeof( int) * num_threads, cudaMemcpyDeviceToHost) ); int c1 = 0; for(int i=0; i< num_threads; i++){ c1+=h_odata[i]; } res = 8.0*(double)c1/(double)(RAND_N); CUDA_SAFE_CALL( cudaFree(d_Random) ); CUDA_SAFE_CALL( cudaFree(d_odata) ); CUT_SAFE_CALL( cutDeleteTimer( hTimer) ); CUT_EXIT(argc, argv); }

Picuda.cu ser compilado com nvcc e rodar no host mccuda_kernel.cu ao ser compilado com nvcc, produzir um cdigo em assembler que rodar na GPU.
file: mccuda_kernel.cu __global__ void PiGPU(float *d_Random, int* d_odata, int rng_count, int nperrng){ const int tid = blockDim.x * blockIdx.x + threadIdx.x; const int thread_n = blockDim.x * gridDim.x; int c1=0; float xx, yy; for(int iRng = tid; iRng < rng_count; iRng += thread_n){ for(int iOut = 0; iOut < nperrng; iOut+=2){ xx = d_Random[iRng + (iOut + 0) * rng_count]; yy = d_Random[iRng + (iOut + 1) * rng_count]; if(xx*xx + yy*yy < 1.0f) c1++; } } // write data to global memory d_odata[tid] = c1; }

48

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

10.Bibliotecas A NVIDIA desenvolveu vrias bibliotecas para que o usurio possa se abstrair de CUDA. Existem tambm bibliotecas desenvolvidas por firmas que as comercializam Entre as vrias bibliotecas disponveis para CUDA, citaremos: CUBLAS - uma biblioteca para operaoes fundamentais ( Level 1, 2 e 3) de lgebra Linear, que d suporte a todas as operaes entre vetores e matrizes. amplamente utilizada pela Lapack e sua verses para CUDA, CULA e MAGMA CULA- uma verso da biblioteca Lapack para CUDA. uma biblioteca para clculos de lgebra Linear, calcada na famosa Lapack. Tem uma verso bsica, gratuita, que tem 6 funes bsicas de LAPACK, e uma verso premium, comercial, que oferece outras 30 funes. CULA existe atualmente para os sistemas operacionais Windows e Linux MAGMA - uma outra verso da biblioteca Lapack para CUDA. gratuita, que tem cerca de 40 funes bsicas de LAPACK. MAGMA existe atualmente para os sistemas operacionais Linux e MacOS. Inclui das funes bsicas da lgebra linear, como soluo de sistemas, tambm funces para fatorizao LU, QR, Cholesky, reduo de Hessenberg, clculo de autovalores e Singular Value Decomposition (SVD). Inclui tambm uma verso prpria da biblioteca BLAS. uma biblioteca adequada a programao de GPU e tambem de multicores. CUFFT - uma biblioteca para clcuulo de Transformadas rpidas de Fourier

CUSP uma biblioteca para clculos com matrizes esparsas. Que aparecem frequentemente na soluo de equaes diferenciais parciais THRUST - uma biblioteca de templates para CUDA. Assemelha-se muito com a Standard Template Library (STL) de C++. J vem com CUDA verso 4.0 Seus objetivos so a produtividade do programador, encorager a programao genrica, oferecer alta performance, e prover interoperabilidade CURAND - uma biblioteca para gerao de nmeros aleatrios. Vejamos em maior detalhes o que existe para nmeros aleatrios, devido a importncia deles, para o trabalho de pesquisa que ser desenvolvido no cluster do CPTEC. CUDA tem os seguintes tipos de geradores de nmeros aleatrios, includos no Software Development Kit (SDK), nos seguintes diretrios C/src/MersenneTwister/ e C/src/quasirandomGenerator Veja uma discusso interessante no paper de Langdon Ref [27]

49

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Existem alternativas ao pacote da NVIDIA que oferecem perodos bem maiores do que os da biblioteca CURAND, como o MTGP MTGP uma nova variante do gerador de Mersenne Twister (MT) introduzido por Mutsuo Saito e Makoto Matsumoto em 2009 Referncia [26]. MTGP foi projetado levando em conta algumas caractersticas de processadores grficos, como execuo em paralelo e uso de memrias de alta velocidade no dispositivo. Tem verses para inteiros de 32 bits bem como de 64 bits.Em 64 bits, apresentou um perodo de 2110503-1, bem superior ao gerador de Mersenne-Twister MT19939 que tem um perodo de 219939-1. um timo gerador para trabalhos de Monte Carlo, embora no o seja para outros tipos de trabalhos, como para criptografia. Em geral as bibliotecas existentes para CUDA so bibliotecas altamente otimizadas, e quase sempre melhor fazer uso delas do que tentar reescrever algo j feito, pois elas contm programas j otimizados e amplamente testados. O uso de bibliotecas otimizadas fundamental para as aplicaes de clculo numrico. A figura 28 abaixo ilustra a idia fundamental:

Figura 28 . Fonte: Cooper 2011, Lecture 7 - Referncia [18 ]

50

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

11. Aplicaes

CUDA tem sido aplicada em vrios campos da computao cientfica, como por exemplo Molecular Dynamics Monte Carlo Processamento de Sinais Biologia computacional Visualizao interativa e renderizao de volumes Previso Numrica do tempo Finanas (Monte Carlo) Sistemas de Informao Geogrfica (GIS) Simulaes eletromagnticas e Geofsicas Processamento de dados Solues de visualizao em 3D para Petrleo e Gs Sntese de circuitos de redes neurais artificiais Aplicaes na Engenharia Biomdica Radioterapia Simulaes de mamografia Planejamento de tratamentos em medicina Nuclear

Na rea da sismologia os chineses relataram o emprego bem sucedido de GPUs, e publicaram comparaes entre sistemas convencionais com sistemas equivalente usando GPU. Em particular a seguinte informao bastante interessante: Um sistema de computao, massivamente paralelo baseado em CPU, de 100 TeraFlops, no mercado internacional custando aproximadamente US$ 3 100 000.00 e tendo um consumo tpico de 575 kW. Foi comparado com um sistema equivalente com GPUs, custando apenas cerca de 300 mil dlares, e consome cerca de 27,5 kW. Isto significa 10X menos na parte de custos e 20X menos na parte de consumo de energia eltrica. Esses valores so tpicos e tem sido citados por nuitos outros grupos. Ficou claro do j exposto na introduo, o ganho excepcional em desempenho e de economia de energia que pode ser conseguido usando-se GPU. A questo atual agora como desenvolver software capaz de aproveitar ao mximo o hardware. Obviamente o aproveitamento pode depender do tipo de aplicao. Clculos embaraosamente paralelos como Monte Carlo podem facilmente atingir desempenhos muito prximos dos mximos teoricos, enquanto que o problema de se determinar solues numrcas de sistemas de equaes parciais so problemas bem mais complexos e nem sempre permitem que se consiga resultados satisfatrios. Speedups de at um fator de 149x tem sido encontrados em aplicaes especficas, como mostrado na Figura 29 abaixo

51

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

Figura 29 - Fonte: NVIDIA - Referncia [22]

52

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

12. Uso do Matlab com CUDA A programao CUDA seja com C ou qualquer outra linguagem sem dvida ainda bastante complexa. Engenheiros e cientistas, frequentemente preferem a facilidade e rapidez para o desenvolvimento, mesmo com o sacrificio da eficincia. As vezes uma primeira soluo faz-se necessria com urgncia e ai a rapidez do desenvolvimento crucial, podendo a ela se seguir uma otimizao numa linguagem que possa oferecer maior desempenho de execuo como CUDA C ou CUDA Fortran. Para isto h uma soluo que o uso da GPI como um acelerador para Matlab, e seus eventuais substitutos, como octave, Scilab ou Python. No caso da Metoorologia e outras cincias da Terra, que utilizam muito o IDL e seu substituto software livre, o GDL, ambos podem usar GPU como aceleradores. MATLAB universalmente utilizado, e apresenta vrias vantagens: 1. Grande coleo de funes intrnsecas. 2. Cdigos em C ou Fortran podem ser chamados diretamente de dentro de MATLAB como se fossem funes intrnsecas, usando-se MEX files. 3. Muito eficiente e fcil de usar para tarefas de processamento de sinais e de imagens A Principal limitao de Matlab a baixa velocidade de processamento em tarefas de processamento de imagens e viso computacional Comparemos com o uso de CUDA. CUDA possibilita que aplicaes computacionalmente intensivas tenham acesso ao tremendos nveis de potncia computacional oferecidos peloas placas de vdeo mais recentes 2. CUDA permite o uso de linguagem de programao C, acrescida de uns poucos comandos, que so extenses para programar levando em conta as caracteristicas das GPUs 3. CUDA expe algumas caractersticas de hardware, no disponveis fora do contexto de programao CUDA Por exemplo. Memria compartilhada a. A memria compartilhada uma rea pequena do chip de memria (atualmente 16KB por multiprocessador) que pode ser acessada em paralelo por blocos de threads. b.Ela permite o colocar no cache dados usados com frequncia e pode causar grandes speedups em relao ao uso de texturas para acessar dados. c. Combinada com uma primitiva de sincronizao de threads, isto permite o processamento paralelo cooperativo de dados no chip, reduzindo enormemente a exigncia de largura de Banda fora do chip de muitos algoritmos paralelos d. til para um grande nmero de aplicaes como algebra linear, Transformada rpida de Fourier ( FFT) e filtros para processamento de imagens.

53

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

MATLAB pode ser facilmente extendido atravs de MEX files para fazer uso da potncia computacional oferecida pelas modernas unidades de processamento grfico da NVIDIA (GPU). Podemos conseguir um speedup considervel em algumas aplicaes como viso computacional, Vejamos algumas maneiras de se conseguir a combinao de Matlab com GPU Vamos comentar aqu apenas trs das solues hoje existentes para usar Matlab (e alguns dos seus substitutos ) juntamente com as GPU, de maneira mais ou menos transparente, atuando como uma aceleradora da CPU. 1.A primeira soluo usar um MATLAB plug-in for CUDA 1. Um plug-in de MATLAB para CUDA permite a acelerao de 2D FFTs padro de MATLAB.Como exemplo considere o exemplo CUDA/MEX de Chris Bretherton na sua simulao espectral de Fourier do escoamento de um fluido 2D, disponvel como parte do meterial de seu curso na University of Washington. 2. Quando MATLAB chama 2D FFT de qualquer tamanho, o plug-in da NVIDIA intercepta a chamada e a trata com um arquivo MEX o qual por sua vez utiliza uma implementao otimizada de CUDA FFT na GPU. 3. Isto transparente para os usurios de MATLAB 4. O plug-in est disponvel para Windows and Linux e pode ser baixado do site seguinte:http://developer.nvidia.com/object/matlab_cuda.html 5. Para fazer a interface de CUDA e MATLAB, o usurio tem que modificar ligeiramente a infreestrutura MEX. Arquivos CUDA tem extenso .cu e precisam ser compilados com um compilador especfico (nvcc). 6. Os scripts criados para compilar arquivos CUDA MEX so muito fceis de usar. Do promto de comando em MATLAB, o usurio precisa chamar nvmex em lugar de mex 7. Vejamos como exemplo um script: nvmex -f nvmexopts.bat filename.cu -IC:\cuda\include -LC:\cuda\lib lcudart 8. CUDA drivers, toolkits e sdk examples podem ser baixados em http://www.nvidia.co.in/object/cuda_get_in.html 9. Um exemplo simples que cria um arquivo MEX que chama CUDA para somar dois vetores pode ser obtido em http://www.mathworks.com/matlabcentral/fileexchange/22436-example-of-cuda-andmatlab-andnothing-else-for-windows 10. Um guia muito bom para usar CUDA e MATLAB mex pode ser obtido em http://www.cs.ucf.edu/~janaka/gpu/index.htm A ferramenta nvmex para estes arquivos tambm est disponvel para download no site acima

2.A segunda soluo usar o software comercial Jacket Engine for MATLAB 1. Jacket uma mquina GPU para MATLAB. Jacket permite que um cdigo padro em MATLAB rode em qualquer GPU da NVIDIA capaz de entender CUDA, desde uma placa GeForce 8400 at uma Tesla das mais modernas. 2. Jacket introduz novos tipos de dados em MATLAB que permitem que voce mova seus dados para a GPU e faa clculos nela 3. Exemplo de programa MATLAB :

54

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

>> >> >> >>

G G G C

= = = =

gdouble( C ); fft( G ); G * G; double( G );

% % % %

Cria uma matriz na GPU Faz uma FFT na Multiplica Matrizes na GPU Matrix Retorna a CPU

4. Ele apenas muda o tipo do dado e permite que se aproveite da tremenda potncia da GPU. 5. No gratuito, mas lhe do 15 de teste grtis. Pode ser comprado no link http://www.accelereyes.com/

3.Uma terceira soluo usar GPUmat que freeware 1. Uma nova ferramenta freeware chamada GPUmat permite o usurio executar cdigo Matlab diretamente na GPU habilitada com CUDA. 2. A execuo transparente para o usurio. 3. Permite speedups de at 40x. 4. completamente grtis para baixar e usar. 5. Informao detalhada pode ser encontrada no site baixo: http://www.gpyou.org 6. User modules podem ser baixados do site http://sourceforge.net/projects/gpumatmodules/

Octave e Scilab Muitas dessas solues se aplicam a Octave. Scilab est em fase de desenvolver algo semelhante, sendo que a verso 6, a mais recente, no momento em que fechamos este trabalho, j apresentava alguma capacidade de aproveitamento de GPUs.

Python Python oferece tambm a funcionalidade de um substituto do Matlab, embora seja mais abrangente, e tambm permite o uso de Python seja em cluster, atravs de MPI seja usando Python e CUDA Uma das maneiras de se utilizar Python e muito semelhante Matlab, e tem os mesmos inconveniente e vantagens. O pior deles sendo a lentido, o que pode ser compensado com o uso de GPU. PyCUDA serve para isto. IDL/GDL

55

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

De maneira anloga, existe uma biblioteca GPULIB, que permite o uso de IDL, e de seu substitituto GDL, numa mquina equipada com CUDA, de maneira a usar o hardware da GPU como uma maneira de acelerar IDL. O software livre GDL tambm j funciona com GPULIB de maneira semi-transparente para o usurio.

56

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

13 Consideraes finais A importncia do uso de Unidades de processamento grfico para computao em geral, esta abrindo um novo captulo na computao de alto desempenho. Essas placas apresentam alto desempenho e devem ser usadas para processamento de grandes quantidades de dados, bem com em situaes onde se podem definir grande nmero de tarefas que podem ser executadas em paralelo. Um modesto investimento habilita qualquer proprietrio de um PC moderno adentrar neste mundo novo, atravs da tecnologia CUDA. A plataforma CUDA atualmente j permite o uso de GPUs para executar aplicaes paralelas, com bastante sucesso, obtendo-se speedups que variam de aplicao para aplicao mas que em alguns casos superam os 140 X CUDA uma extenso da linguagem C, sendo de fcil aprendizado, havendo muita documentao disponivel gratuitamente na internet, mas para rodar de modo eficiente, essencial que o cdigo seja otimizado, o que ainda batante difcil. Alm do mais CUDA s seve em placas da fabricante NVIDIA. Uma alternativa ao CUDA a linguagem OpenCL permite criar programas que rodam em mltiplas arquiteturas, mas difcil fazer um programa genrico que seja eficiente em arquiteturas diferentes, e OpenCL, entretanto, ainda esta muito menos desenvolvido do que CUDA. Espera-se grandes avanos nos prximos anos, tais como novos hardwares, novos software para desenvolvimento, compiladores e ambientes de desen volvimento, e a novas bibliotecas e sistemas de somputao que devero tornar mais fcil o uso das GPU e o seu aproveitamento pela comunidade cientfica, sem necessriamente ter que entrar nos detalhes da programao muito prxima do hardware. CUDA foi o primeiro passo nesta direo.

57

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

14. Referncias Bibliogrficas

[1] NVIDIA - CUDA C Best Practices Guide. NVIDIA, Version 3.2, 20/8/2010. [2] NVIDIA - CUDA C Programming Guide. NVIDIA, Version 3.2, 11/9/2010. [3] NVIDIA CUDA Programming Guide, NVIDIA, Version 4.0 , 2011 [4] Sanders, J. e Kandrot,E. 2011 - CUDA by example, an introduction to GeneralPurpose GPU Programming, Addison Wesley. [5] CUDA Zone (http://www.nvidia.com/object/cuda home new.html), Maro2011. [6] GPUBrasil(http://gpubrasil.com), Maro 2011. [7] Wikipedia http://en.wikipedia.org [8] Kirk,D. e Hwu,W. Morgan Kaufman.2010: Programming Massively Parallel Processors: A Hands-on Approach , Elsevier [9] The GPU Computing Era. J. Nickollsand W. Dally. IEEE Micro, 30(2):5669, 2010. [10] The Top 10 Innovations in the New NVIDIA Fermi Architecture, and theTop 3 Next Challenges. David Patterson, September 30, 2009. [11] NVIDIA's Next Generation CUDA Compute Architecture: Fermi. NVIDIA Whitepaper, Version 1.1. [12] Thomadakis, ME 2011: Introduction to GPU Architechtures for HPC Computing Texas A&M University http://sc.tamu.edu/systems/eos/GPU-Intro.pdf acesso em 6 de outubro de 2011. [13] Camargo, R.Y. De, 2010 Mini-curso Introduo Programao em CUDA I Escola Regional de Alto Desempenho de SP I ERAD-SP 2010

[14] Martins, WS e Lucas, DCS Programao CUDA Introduo Minicurso Conpeex 2010, Universidade Federal de Gois

[15] Stringhini,D. e Goldman,A. Aspectos de otimizao no desenvolvimento de aplicaes em CUDA - II Escola Regional de Alto Desempenho de SP II ERAD-SP 2011

58

XXIII SEMAT - So Jos do Rio Preto UNESP, 17 a 21 de outubro de 2011

[16] Seland,Johan Cuda Programming Geilo Winter School

[17] Matloff, N.,2010 - Programming on Parallel Machines disponvel em http://heather.cs.ucdavis.edu/~matloff/ParProcBook.pdf [18] Cooper, C. GPU Computing with CUDA 10 lectures Agosto de 2011 UTFSM, Valparaiso, Chile [19] Won-Ki Jeong -Accelerating MATLAB with CUDA, Massimiliano Fatica (mfatica@nvidia.com), NVIDIA, Univ. of Utah [20] Optimization principles and application performance evaluation of a multithreaded gpu using cuda. ShaneRyoo, Christopher I. Rodrigues, Sara S. Baghsorkhi, Sam S. Stone, David B. Kirk, andWenmeiW. Hwu. In PPoPP, pginas 73-82. ACM, 2008. [21] PassMark CPU Benchmarks <http://www.cpubenchmark.net/cpu_list.php> [22] NVIDIA - Introduction to CUDA. NVIDIA, 2010. [23] Radev, R. GPU computing CUDA, 2008. [24] Giles, M. 2011 CUDA Lectures, University of Oxford UK [25] Tom Oberhuber, Atsushi Suzuki, Jan Vacata, Vt ezslav abka- Use of NVIDIA CUDA for numerical solution of partial differential equations, disponvel em http://geraldine.fjfi.cvut.cz/~oberhuber/data/hpc/paa/prezentace/cuda-for-pde.pdf acesso em 6 de outubro de 2011. [26] MTGP - Mersenne Twister for Graphic Processors. Disponvel em http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MTGP/index.html [27] Langdon, W.B. - A Fast High Quality Pseudo Random Number Generator for NVIDIA CUDA, GECCO 2009, July 812, 2009, Montreal.ACM, disponvel em http://www.cs.ucl.ac.uk/staff/w.langdon/ftp/papers/langdon_2009_CIGPU.pdf

59