Arquivos

Arquivo do Autor

CUDA para CPU – MCUDA

19 19UTC maio 19UTC 2010 Labaki Deixar um comentário

Vejam que idéia interessante:

.

CUDA é um modelo de programação de paralelismo de dados que oferece várias abstrações-chave como thread blocks, hierarquia de memória e barreira de sincronização para escrever aplicações. Esse modelo tem sido provado eficiente para a programação de GPUs.

Esse paper de Stratton, Stone & Hwu (2008) descreve um framework chamado MCUDA, que permite que programas CUDA sejam executados eficientemente em multi-core CPUs de memória compartilhada.

Com esses resultados, eles mostram que CUDA pode ser um model de programação paralela eficiente não só para arquiteturas de GPUs.

.

Clique aqui para ver o artigo.

Clique aqui para ver a página de download do MCUDA.

Categoriasacadêmico

Instalação do CUDA 3.0 no Ubuntu 10.04

12 12UTC maio 12UTC 2010 Labaki 4 comentários

Roteiro para instalação do CUDA no Ubuntu 10.04 de 32 ou 64 bits.

por L. G. Turatti

1. Baixar o driver de video 195.36.24 para 32 ou 64 bits;

2. Remover os drivers nvidia instalados

sudo apt-get –purge remove nvidia-*

3. Crie o arquivo /etc/modprobe.d/nvidia-graphics-drivers.conf com o seguinte conteudo:

blacklist vga16fb

blacklist nouveau

blacklist lbm-nouveau

blacklist nvidia-173

blacklist nvidia-96

blacklist nvidia-current

blacklist nvidiafb

4. Crie ou ajuste /etx/X11/xorg.conf com o seguinte conteudo:

Section “Device”

Identifier “Device0″

Driver “nvidia”

VendorName “NVIDIA Corporation”

EndSection

5. Reinicie o computador (reboot);

6. Aparecerá uma tela de erro. Dê “OK” e a seguir, saia para modo console;

7. Faça o login; instale o driver e permita a configuração sugerida

sudo sh NVIDIA-Linux-<versao>.run

8. Reinicie o computador (reboot);

9. Instale o Toolkit para 32 ou 64 bits

sudo sh cudatoolkit_3.0_linux_<versao>.run

10. Edite o .bashrc do usuario 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

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

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

12. A sugestao do toolkit é adicionar as linhas acima em /etc/ld.so.conf.

13. Instalando o SDK:

chmod +x gpucomputingsdk_3.0_linux.run

./gpucomputingsdk_3.0_linux.run

14. Satisfazendo dependencias do SDK:

sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev mesa-commondev

libgl1-mesa-dev libglu1-mesa-dev libxi-dev libxmu-dev

freeglut3 libmotif3

sudo ln -s /usr/lib/libglut.so.3 /usr/lib/libglut.so

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

15. Para adequar a libGL do pacote atual do driver NVidia 195.36.24

sudo rm /usr/lib/libGL.so

sudo ln -s /usr/lib/libGL.so.1 /usr/lib/libGL.so

16. Instalar gcc 4.3

sudo mkdir /usr/bin/gcc-4.3

sudo mkdir /usr/bin/g++-4.3

sudo mkdir /usr/bin/g++-4.4

sudo apt-get install gcc-4.3 g++-4.3

sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.3 40 –slave /usr/bin/g++ g++ /usr/bin/g++-4.3

sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.4 60 –slave /usr/bin/g++ g++ /usr/bin/g++-4.4

17. Configurar para utilizar o gcc4.3

sudo update-alternatives –config gcc

18. Compilando os exemplos do SDK:

cd <diretório do usuário>/NVIDIA_GPU_Computing_SDK/C

make

19. Após algum tempo a compilação terminará sem mensagens de erros. Entre no diretório e execute os exemplos para testar:

cd bin/linux/release

./fluidsGL

./particles

Pronto! Se os exemplos apareceram, a instalação esta concluída!

Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!

Categoriastutorial

Mini-simpósio no MECOM-CILAMCE 2010

13 13UTC março 13UTC 2010 Labaki Deixar um comentário

Introdução do nosso mini-simpósio no MECOM-CILAMCE 2010 -IX Congresso Argentino de Mecânica Computacional e XXXI Congresso Ibero-Latino-Americano de Mecânica Computacional. Esses congressos acontecerão entre 15 e 18 de novembro de 2010 em Buenos Aires. Prepare seu trabalho!

Title

High Performance Computing on Graphics Hardware (GPGPU)

Organizers

Euclides Mesquita, euclides@fem.unicamp.br
Josué Labaki, labaki@fem.unicamp.br
Luiz Otávio Saraiva Ferreira lotavio@fem.unicamp.br

Department of Computational Mechanics DMC
School of Mechanical Engineering -FEM
State University at Campinas – UNICAMP/Brazil.

Summary

After a long period of steady growth, desktop commodity computer architecture has reached its ceiling on computing performance. Further progress is no longer enabled by growth in core clock rates, but by growth in parallelism. Many articles have been presented in the last editions of CILAMCE and MECOM on the use of multi-cored computing applied to a variety of problems. Furthermore, there is a growing trend toward parallel computation on the recently created general-purpose graphics hardware (GPGPU) [1]. Due to its architecture, the GPU is specially well-suited to address problems that can be expressed as data-parallel computations with high arithmetic intensity (the ratio of arithmetic operations to memory operations) [2]. Recent works have been shown astonishingly fast computations. For instance, papers on the use of GPGPU for computational mechanics have been reporting performances up to 100 times faster than CPUs for solution of linear systems, and around 900 times faster for numerical solution of infinite oscillatory integrals [3]. The first edition of this mini-symposium on CILAMCE 2009 has shown that the GPU has been investigated by researches of a very broad range of subjects in computational modeling with considerable gains in performance. The idea of the present mini-symposium is to gather researchers working on HPC tasks using GPGPU systems, aiming to discuss the state of the art issues, exchange experiences and solutions for existing implementation strategies and problems.

Suggested readings

[1] OWENS, J. D. et al., “A Survey of General-Purpose Computation on Graphics Hardware”, Computer Graphics, 26, 1 (2007), pp.  80-113.

[2] NVIDIA. “NVIDIA CUDA – Compute Unified Device Architecture – Programming Guide”. NVIDIA Corporation, Santa Clara (2008).

[3] MESQUITA, E.; LABAKI, J.; FERREIRA, L. O. S. “An Implementation of the Longman’s Integration Method on Graphics Hardware”. Computer Modeling in Engineering and Sciences, 51, 2 (2009), pp. 143-168.

CategoriasNoticia, acadêmico

Comparação GPU x sistemas paralelos

15 15UTC dezembro 15UTC 2009 Labaki Deixar um comentário

Monografia de conclusão de curso de A. V. Grammelsbacher e J. C. C. Medrado.

O trabalho visa fornecer um estudo comparando a execução de algoritmos paralelos na CPU e na GPU, elucidando se é mais vantajoso executar determinados algoritmos na CPU ou na GPU. Para realizar as comparações são feitos benchmarks da execução de algoritmos com a finalidade de medir a capacidade de processamento em FLOPS , a cópia de dados na memória entre outras características do sistema.

Comparacao de desempenho entre GPGPU e Sistemas Paralelos

Categoriasacadêmico, cookbook

CILAMCE 2009

1 01UTC dezembro 01UTC 2009 Labaki Deixar um comentário

Organizamos um mini-simpósio sobre supercomputação com GPU no 30º Congresso Ibero-Latino-Americano de Métodos Computacionais em Engenharia – CILAMCE 2009. O objetivo era reunir as pessoas que estão trabalhando com esse assunto no Brasil.

O resultado foi melhor do que esperávamos. Treze resumos foram submetidos, e seis trabalhos foram apresentados. Veja os trabalhos apresentados:

[1] K. Raizer, H. S. Idagawa, E. G. O. Nóbrega, L. O. S. Ferreira:

Training and Applying a Feedforward Multilayer Neural Network in GPU [ver].

[2] H. F. Gasparoto, L. O. S. Ferreira:

Development of a Heuristic Type “Generate And Test”, Parallel and Random, to Optimize Functions in GPU [ver].

[3] L. Y. Pozzo, H. S. Idagawa, L. O. S. Ferreira:

Solver Development for Linear Systems by Steepest Descent Method for Parallel Processing on GPU [ver].

[4] J. Labaki, L. O. S. Ferreira, E. Mesquita:

Implementation of Quadratic Boundary Elements for 2D Potential Problems on Graphics Hardware – GPU [ver].

[5] G. B. Vitor, J. V. Ferreira, A. Körbes:

Fast Image Segmentation by Watershed Transform on Graphical Hardware [ver].

[6] T. M. Buriol, M. A. Argenta:

Acelerando o Desenvolvimento e o Processamento de Análises Numéricas Computacionais Utilizando Python e Cuda [ver].

.

Nos vemos no CILAMCE 2010 – Buenos Aires!

CategoriasNoticia

Vídeo: tecnologia GPU

4 04UTC novembro 04UTC 2009 Labaki Deixar um comentário

Ótimo vídeo mostrando as principais ferramentas da tecnologia GPGPU. Trata-se da palestra de abertura da GPU Technology Conference, que aconteceu em San Jose de 30 de setembro a 2 de outubro deste ano.

Download: http://www.nvidia.com/content/GTC/videos/GTC09-1412.flv

Palestrante: Will Ramey, gerente de produto da NVidia.

Conteúdo postado por Luís Ramirez na lista GPUBrasil.

CategoriasUncategorized

Sinopse do artigo: BEMxGPU

16 16UTC outubro 16UTC 2009 Labaki Deixar um comentário

Achei um artigo muito interessante,

Takahashi, T.; Hamada, T. (2009): “GPU-accelerated boundary element method for Helmhotz’ equation in three dimensions“.

Mesmo para quem conhece Elementos de Contorno, vale a pena ler o artigo. Aprendi várias coisas sobre GPU com ele, mesmo sem ter entendido muito a parte de Elementos de Contorno (apesar de ser minha área de pesquisa):

Peak performance

O artigo fala que “um processador escalar é capaz de executar 2 operações aritméticas por ciclo de clock. Nossa GPU tem 1.17 GHz e 12 multiprocessadores, num total de 96 processadores escalares. Portanto, a peak performance é de 228.1 Gflop/s”.

O “portanto é novo pra mim. Eu não sabia que era possível calcular a peak performance da máquina a partir desses dados… Como dá pra ver o clock da minha GPU no manual (1,296 GHz), e eu sei que ela tem 30 multiprocessadores, agora sei que a peak performance dela é 622.1 Gflop/s.

Fonte de citação

O artigo revê vários conceitos da programação CUDA e da tecnologia GPGPU. Isso é bom não só pra reforçar nosso know-how, mas também é sempre bom ter fontes adicionais pra citar nos nossos artigos. Frases de efeito que o artigo usa que talvez você queira citar:

  • Um warp tem mesmo 32, e não 16 threads;
  • O manual CUDA recomenda blocos com múltiplos de 64 threads para máxima performance;
  • A velocidade de floating-point operations throughput atual das GPUs é até 20 vezes maior que da CPU;
  • Programas de engenharia têm sido experimentados na GPU antes de CUDA, com OpenGL, DirectX, Cg e dispositivos dedicados.

Custo computacional

O artigo revisa o custo computacional de importantes métodos matemáticos. Por exemplo, ele fala que o custo computacional da solução direta de sistemas lineares (como escalonamentos, pivoteamentos, eliminação de Gauss) é da ordem de O(N3), e o consumo de memória é O(N2). Ele diz isso pra justificar a escolha de métodos iterativos no trabalho, como o gradiente conjugado, cujo custo computacional cai pra O(N2) e o consumo de memória cai pra O(N). Boa justificativa pro pessoal que mexe com gradiente conjugado & cia! O artigo ressalva, contudo, que o custo nesses métodos iterativos é proporcional ao número de iterações necessários para o método convergir, e que portanto um pré-condicionamento da matriz é sempre necessário para minimizar esse custo.

Em outro ponto no final do artigo, eles confirmam essa afirmação comparando um pré-condicionador (point-Jacobi), que permitiu convergência em 543 passos e 7498 s, com outro (block-diagonal) que convergiu em 446 passos em 9095 s (não, o resultado não está invertido). Essa diferença de 21% na eficiência justifica investir no estudo de pré-condicionadores.

E já que estamos falando de sistemas lineares: o artigo também alerta que sistemas lineares podem apresentar autovalores fictícios, que podem não só desacelerar a convergência do solver como degenerar os resultados. Há métodos para remover esses autovalores, como o de Burton-Miller, citado no trabalho.

Benchmark justo

Quando comparamos um código em GPU com CPU, os códigos têm que ser o mais parecidos possível para que a comparação seja justa. Para garantir que a comparação seja justa, o artigo faz uma coisa que eu nunca tinha visto: ele conta o número de operações que o algoritmo executa: quantas adições/subtrações, multiplicações, e uso de funções transcendentais. Aí é só garantir que CPU e GPU executem o mesmo número de operações, e a comparação terá sido justa. De quebra, aprendi que há uma forma de executar divisões implementada em hardware! É a função __fdividef(alfa,beta), que equivale a alfa/beta (eu só conhecia __sinf e __cosf).

Precisão mista

O artigo traz uma explicação bem detalhada sobre como fazer precisão mista, que serve para usar precisão dupla só quando for necessário ou para emular precisão dupla em GPUs que não têm esse recurso. Tem até um trecho de código explicando como fazer isso:

static __device__ __inline__ void dsacc0(float *ah, float *al, float b)

{

float t1 = *ah + b;

float e = t1 – *ah;

float t2 = ((b-e) + (*ah – (t1 – e))) + *al;

*ah = t1 + t2;

*al = t2 – (*ah – t1);

}

Todos sabemos que precisão dupla ainda é um ponto fraco das GPGPUs. A maioria só tem precisão simples, e nas que têm precisão dupla, o desempenho é dezenas de vezes inferior do que o da precisão simples. No entanto, precisão dupla, que é inútil em cálculos gráficos, é essencial em problemas de engenharia como o método dos elementos de contorno (assunto do artigo).

Threads por bloco

Na página 18, os autores contam em detalhes como fizeram para otimizar o número de threads por bloco.

  • Nthreads deve ser múltiplo de 64, de acordo com o manual do CUDA;
  • Cada bloco tem somente 16kb de memória compartilhada;
  • Os múltiplos de 64 que não excedem 16kb (neste problema) são: 64, 128, 192, 256 e 320;
  • Blocos com esses números de threads usariam respectivamente 1408, 2816, 4416, 5632 e 7360 registradores (neste problema). Como o número máximo de registradores é 8192, esse não é um parâmetro a se preocupar (neste problema);
  • Dois ou mais blocos são recomendados por multiprocessador, para compensar a carga de latência;
  • Como os blocos de 192, 256 e 320 threads resultariam em menos que isso, essas opções são descartadas;
  • 64 threads resultaria em 5 blocos por multiprocessador, mas o artigo afirma que a eficiência de caching de dados diminui com o tamanho do bloco;
  • Conclusão: o tamanho ótimo do bloco é 128 threads (de largura).

É interessante ler a discussão inteira. Dá várias idéias sobre como escolher o tamanho de bloco nos nossos próprios problemas.

Padrões de floats

Devido à imprecisão dos resultados da GPU, não é uma boa idéia usá-la na integração numérica de singularidades. Como essa integração é necessária no método dos elementos de contorno, os autores fizeram com que a parte singular das integrais fosse calculada pela CPU e a parte não-singular pela GPU. O resultado da integral era a soma dos resultados dos dois dispositivos. Aí a surpresa: GPUs não seguem a mesma especificação IEEE-754 sobre aritmética de ponto flutuante que as CPUs seguem! Assim, a partir de um dado número de elementos, a precisão do resultado da integral “quebrava”, isto é, a integral não melhorava se o integrador fosse refinado.

Observe como a GPU em precisão simples perde precisão mesmo com o aumento do refinamento.

Observe como a GPU em precisão simples perde precisão mesmo com o aumento do refinamento.

Isso parece ter sido tão frustrante que os autores desistiram de usar precisão simples a partir daí (apesar dela ser incrivelmente mais rápida na GPU).

Limite da GPU

Meus programas sempre têm um limite de tamanho de dados que eu posso usar, mas nunca investiguei isso a fundo. No fim, não sei a razão desse limite. Nesse artigo, um gráfico pouco usual é plotado. No eixo y, em vez de milissegundos, são mostrados Gflop/s.

Figura 5: Performance da GPU em tempo total versus tempo de kernel.

Figura 5: Performance da GPU em tempo total versus tempo de kernel.

Como a porcentagem de capacidade de computação do kernel vai sempre se aproximando da do programa completo e o total tende a uma assíntota (claro, a GPU tem uma peak performance), os autores concluíram que o programa deles era limitado pela aritmética, e não pela largura de banda de memória.

Boa leitura!

Categoriasacadêmico

Curso CUDA

8 08UTC outubro 08UTC 2009 Labaki Deixar um comentário

Curso de CUDA no Simulation-Based Engineering Laboratory. Contém os slides e áudio do curso, além de exercícios, projetos da turma, e uma excelente introdução sobre colisão/detecção de corpos.

Sugestão do Luís Ramirez para a lista GPUBrasil.

Categoriasacadêmico, tutorial

Medição de tempo

2 02UTC outubro 02UTC 2009 Labaki Deixar um comentário

Freqüentemente precisamos medir o tempo de execução de um programa, especialmente quando queremos mostrar que um programa em GPU é mais rápido que um em CPU. A maioria das funções que a linguagem C oferece não servem a esse propósito, já que medem o tempo em segundos, e um programa para GPU raramente completa um segundo de execução. As bibliotecas CUDA oferecem um recurso simples para fazer essa medição, em unidades de milissegundos. Eis um exemplo de código:

# include <stdlib.h>

# include <stdio.h>

# include <cutil.h>

int main()

{

float tempo;

unsigned int timer = 0;

CUT_SAFE_CALL( cutCreateTimer( &timer));

CUT_SAFE_CALL( cutStartTimer( timer));

// Região de execução: aqui vai o trecho de código cujo

// tempo de execução queremos medir.

tempo = CUT_SAFE_CALL( cutGetTimerValue(timer));

printf(“A execução durou %5.3f milissegundos\n”, tempo);

CUT_SAFE_CALL(cutDeleteTimer(timer));

}

Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!

Categoriascookbook, dica

Instalação do emulador CUDA

2 02UTC outubro 02UTC 2009 Labaki Deixar um comentário

Roteiro para instalação do CUDA em modo de emulação (para quem não tem uma placa da série 8000 ou superior) no Ubuntu 7.10, 8.04 e 8.10 32/64 bits.
Obs.: Ainda não há suporte do NVIDIA/CUDA para as versões do Ubuntu 8.04 (em fase de desenvolvimento) e 8.10 (inexistente). Portanto, para todas as versões do Ubuntu serão usados os arquivos da última revisão estável, no caso 7.10 (32/64 bits).

1. Baixar os seguintes arquivos do site da NVIDIA e salvá-los na pasta raiz da sua área de usuário:

a) O kit de ferramentas (Toolkit): NVIDIA_CUDA_Toolkit_2.0_Ubuntu7.10_x86.run (ou o mais novo);

b) O kit para desenvolvimento de software (SDK): NVIDIA_CUDA_sdk_2.02.0807.1535_linux.run (ou o mais novo).

2. Instale os pacotes de compilação em linguagem C necessários com o seguinte comando:

sudo apt-get install build-essential libglut3-dev libc6-dev-i386 libstdc++6 -y

3. * SOMENTE PARA UBUNTU 8.10 * – O Ubuntu 8.10 possui como compilador padrão o gcc 4.3, que não é compatível com a versão estável do SDK do CUDA. Portanto, deve-se instalar o gcc 4.1 e configurá-lo como sendo uma alternativa de mecanismo de compilação. Isto é feito através dos comandos:

sudo apt-get install gcc-4.1 g++-4.1 –y

sudo update-alternatives –install /usr/bin/gcc gcc /usr/bin/gcc-4.1 60 –slave /usr/bin/g++ g++ /usr/bin/g++-4.1

4. Para proceder com a instalação do toolkit, altere a propriedade do arquivo .run para que seja interpretado como arquivo executável e invoque sua execução através do shell:

sudo chmod +x NVIDIA_CUDA_Toolkit_2.0_Ubuntu7.10_x86.run

sudo ./NVIDIA_CUDA_Toolkit_2.0_Ubuntu7.10_x86.run auto

5. Rode o editor gedit no modo superusuário para acrescentar as seguintes linhas ao final do arquivo de configuração .bashrc

sudo gedit .bashrc

6. Após o editor abrir o arquivo, mova o cursor até a última linha e digite:

export PATH=$PATH:/usr/local/cuda/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib

7. Salve o arquivo e saia do editor.

8. Feche o terminal digitando exit, para que a alteração tenha efeito.

9. Para instalar o SDK, abra novamente o terminal de texto e digite:

sudo chmod +x NVIDIA_CUDA_sdk_2.02.0807.1535_linux.run

sudo ./NVIDIA_CUDA_sdk_2.02.0807.1535_linux.run

10. Entre na pasta do SDK:

cd NVIDIA_CUDA_SDK

11. Compile o SDK utilizando a diretiva de emulação (emu = 1)

sudo make emu=1

12. Entre na pasta dos programas-exemplo compilados

cd bin/linux/emurelease

13. Veja a lista de programas digitando

ls

14. Execute os programas de sua preferência. Por exemplo:

./clock

ou

./dwtHaar1D

Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!

Categoriasinstalação