Arquivo de etiquetas: NVidia


No período de 18 a 22 de setembro ocorreu na Universidade Federal de Goiás (UFG) o minicurso “Programação CUDA”. O minicurso, com carga horária de 10 horas, teve como objetivo possibilitar ao aluno ter conhecimentos gerais sobre programação paralela, e seu uso no contexto de placas aceleradoras usando programação CUDA. O curso ocorreu como parte das atividades do Conpeex (Congresso de Pesquisa, Ensino e Extensão) da UFG, e teve grande procura (102 inscritos), com participação média de cerca de sessenta pessoas, entre alunos da UFG, e de outras instituições, além de profissionais da área.

Ementa do curso:

Introdução à computação paralela e evolução das arquiteturas de computadores. Visão geral da arquitetura CUDA e sua linguagem de programação: gerenciamento de memória, código paralelo (kernel) e sua execução, coordenação de atividades entre CPU e GPU, recursos de desenvolvimento, memória compartilhada e sincronização. Visão geral de técnicas de otimização: a arquitetura CUDA, memória, configuração de execução, instruções. Aplicações usando CUDA e perspectivas futuras.

Sobre os instrutores:

Wellington S. Martins: concluiu o doutorado (PhD) em Ciência da Computação na University of East Anglia (Inglaterra). Obteve o título de Mestre em Sistemas de Computação pela Pontifícia Universidade Católica do Rio de Janeiro. Atualmente é professor no Instituto de Informática da Universidade Federal de Goiás. Suas áreas de interesse incluem: computação paralela e distribuída, análise e projeto de algoritmos, mineração de dados, e biologia computacional.

Divino César S. Lucas é estudante do último período de Ciência da Computação da PUC-GO. Faz pesquisa nas áreas de Programação Paralela, Bioinformática e Metaheurísticas. Competidor da maratona de programação ACM-ICPC.

O material utilizado nas aulas já está disponível no site do curso: http://inf.ufg.br/gpu

A NVIDIA anunciou um parceria com o site de competições de programação Topcoder para promover uma série de competições onde os problemas propostos deverão ser resolvidos utilizando a plataforma NVIDIA-CUDA.

[1] http://www.topcoder.com/tc?module=Static&d1=sponsors&d2=NVIDIAOverview

[2] http://www.nvidia.com/object/io_1251349762280.html

O advento das CPUs multicore e das GPUs manycores significa que o caminho para desenvolvimento de novos processadores são sistemas paralelos. Além disso o paralelismo obtido com estes chips continuam com a evolução prevista pela lei de Moore [6]. O desafio agora é desenvolver softwares que consigam utilizar de forma eficiente o número de cores disponíveis no sistema e que a performance destes acompanhe de forma transparente o aumento do número de nucleos disponíveis. Aplicações com estas caracteristicas já existem na área de jogos, as quais utilizam os recursos disponíveis para manipular imagens de alta resolução e produzir cenas o mais realistas possíveis em frações de segundos.

CUDA é um modelo de programação paralela e um ambiente de software projetado para superar estes desafio enquanto requer uma baixa curva de aprendizado para programadores familiares com linguagens tradicionais como a linguagem C.

CUDA é composta de três abstrações principais, a saber: uma hierarquia de grupo de threads, memorias compartilhadas, sincronização via barreiras – que são expostos para o programador atraves de um conjunto minimo de extenções para a linguagem C.

Estas abstrações possibilitam o paralelismo de dados e threads. Elas levam o programador a particionar o problema em subproblemas que podem ser solucionados independentemente em paralelo e então combinar estas partes para que possam ser trabalhadas cooperativamente. Tão decomposição preserva a expressividade da linguagem e permite que as threads cooperem quando estiverem trabalhando nos subproblemas, e ao mesmo tempo permite uma evolução de performance de forma transparente já que cada subproblema pode ser agendado para ser executado em qualquer um dos núcleos disponíveis: Um programa em CUDA pode portanto executar em qualquer número de núcleos, apenas o sistema de runtime precisa saber quantos núcleos estão disponívei.

GPU: Processador manycore altamente paralelo

Movido pelo insaciavel demanda de mercado por aplicações de tempo real, graficos 3D de alta definição a GPU evoluiu para um processador manycore altamente paralelo com um gigantesco poder de computação e uma grande largura de barramento de memória, como ilustrado pela figura 1.

performancebandwidthFigura 1

A razão por trás da grande diferença de poder de computaçaõ entre a CPU e a GPU é que a GPU é especializada para tarefas de computação intensiva e altamente paralela – exatamente o que renderização gráfica trabalha – e portanto foi projetada de forma que mais transistores são dedicados para processamento ao inves utiliza-los para cache e/ou controle de fluxo, veja a figura 2 para uma representação gráfica.

arquitetura

Figura 2

Mais especificamente, a GPU foi especialmente projetada para resolver problemas que podem ser expressos em termos de computações com diversos dados em paralelo – o mesmo programa é executado para cada elemento de dado em paralelo – e com alta necessidade de aritimetica. Devido ao mesmo programa ser executado para cada porção de dados, existe pouca necessidade de uma unidade de controle de fluxo sofisticada; e porquê ele é exeuctada em diversos dados em paralelos e tem alta requisição para calculos, a latencia de acesso a memória pode ser ocultada com calculos ao inves de caches gigantes.

Processamento de dados em paralelo mapeia a mesma porção de dados para diversas threads ao mesmo tempo. Muitas aplicações que processam grandes quantidades de dados podem utilizar um modelo de programação paralelo para acelerar suas as computações realizadas. Na renderização 3D grandes conjuntos de pixels e vertices são mapeados para threads executando em paralelos. Aplicações de processamento de imagem e video tais como codificação e decoficação de video, redimencionamento de imagem, visão computacional e reconhecimento de padrões, podem mapear blocos de imagens e pixels para threads executando em paralelo. De fato muitos algoritmos fora do campo de processamento de imagem e video estão sendo acelerados pelo processamento de dados em paralelo, desde simulação física e computação finânceira até biologia computacional. Você pode encontrar diversos exemplos de aplicações e o ganho de performance que obtiveram aqui [3].

O modelo de programação CUDA foi projetado para expor todo o potencial de processamento paralelo as GPUs. Existem milhões de GPUs espalhadas por todo o mundo e você mesmo pode estar utilizando uma agora e nem sabe, confira em [4] a lista das placas gráficas que suportam CUDA.

Referências:

1. http://www.nvidia.com.br/object/cuda_home_br.html#
2. http://www-csl.csres.utexas.edu/~billmark/teach/cs395t-06-spring/
3. http://www.nvidia.com.br/object/cuda_develop_br.html
4. http://www.nvidia.com.br/object/cuda_learn_products_br.html
5. http://www.techradar.com/blogs/article/parallel-computing-and-you-496480
6. http://pt.wikipedia.org/wiki/Lei_de_moore
7. http://courses.ece.uiuc.edu/ece498/al1/Syllabus.html
8. http://courses.ece.uiuc.edu/ece498/al1/Archive/Spring2007/Syllabus.html

Esta foi uma apresentação que fiz durante o primeiro FreeComp (evento realizado pelo C.A de C.C da UCG), durante a palestra expliquei porquê está havendo a mudança de “one-core” para os manycore e multicore. Expliquei como é a arquitetura de uma GPU NVidia e o que é a tecnologia NVidia CUDA, dando alguns exemplos de código e aplicações que foram desenvolvidas utilizando-a. Para fechar discutimos um pouco sobre como será o processador do futuro, integração GPU, PPU e CPU.

Os slides que utilizei podem ser baixados aqui, qualquer dúvida ou sugestão pode ser postado aqui ou enviado
para meu e-mail.

Grande abraço, John.

Olá.

Estou escrevendo este post porquê já a algum tempo estava procurando um bom tutorial de como instalar a biblioteca CUDA no ubuntu 8.04 (Hardy Heron) e por fim encontrei este excelente tutorial: CUDA Development in Ubuntu e o que estarei apresentando aqui para vocês é a minha tradução e interpretação deste artigo que julguei ser de ótima qualidade.

O que está em verde são linhas de comando você pode copia-las e colar (ctrl+shift) em seu terminal que funcionará.

# Parte 1
# Instalando os pacotes básicos de programação no ubuntu
sudo apt-get install build-essential libglut3-dev -y

# Instalando o driver da NVidia
# a partir do site oficial da nvidia (utilizou-se o wget mas você pode baixar diretamente do site)
wget http://developer.download.nvidia.com/compute/cuda/2_0/linux/driver/NVIDIA-Linux-x86-177.67-pkg1.run

# Tornando o arquivo que foi baixado, executável
chmod +x ./NVIDIA-Linux-x86-177.67-pkg1.run

# Este comando irá fechar o seu ambiente gráfico, a instalação do driver requer isso.
sudo /etc/init.d/gdm stop

# Instale o driver; na minha máquina eu fui questionado se desejava baixar uma versão do kernel
# pre-compilada, confirmei que sim porém não baixou e o programa de instalação criou uma versão
# locamente e a utilizou.
sudo ./NVIDIA-Linux-x86-177.67-pkg1.run

# Inicialize novamente a interface gráfica
sudo /etc/init.d/gdm start

# Este passo é para resolver um conflito de drivers; se não o fizermos a máquina entrar em um modo
# gráfico pobre ao ser reiniciada.
sudo gedit /etc/default/linux-restricted-modules-common
# Mude/Adicione (separado por espaço) o texto DISABLED_MODULES(” “) para DISABLED_MODULES(“nv”)

# Parte 2
# Instalando o CUDA Toolkit
wget http://developer.download.nvidia.com/compute/cuda/2_0/linux/toolkit/NVIDIA_CUDA_Toolkit_2.0_ubuntu7.10_x86.run
chmod +x NVIDIA_CUDA_Toolkit_2.0_ubuntu7.10_x86.run
sudo ./NVIDIA_CUDA_Toolkit_2.0_ubuntu7.10_x86.run auto

# Configurando as variáveis de ambiente (digite exatamente o que está abaixo, digite logado no usuário que irá compilar os programas – após esse passo reinicie seu terminal)
echo “# CUDA stuff
PATH=\$PATH:/usr/local/cuda/bin
LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/cuda/lib
export PATH
export LD_LIBRARY_PATH” >> ~/.bashrc

# Parte 3
# Instalando o CUDA SDK (Pressione enter em ambas as perguntas para confirmar o diretório padrão)
wget http://developer.download.nvidia.com/compute/cuda/2_0/linux/sdk/NVIDIA_CUDA_SDK_2.02.0807.1535_linux.run
chmod +x ./NVIDIA_CUDA_SDK_2.02.0807.1535_linux.run
./NVIDIA_CUDA_SDK_2.02.0807.1535_linux.run

# Parte 4
# Compile e execute um exemplo para ficar admirado! ;-)
cd ~/NVIDIA_CUDA_SDK/
make
~/NVIDIA_CUDA_SDK/bin/linux/release/nbody

fluidsGl

nbody

# Parte 5
# Instalar o configurador do driver da NVidia
sudo apt-get install nvidia-settings

# Parte 6
# O Compiz as vezes entra em conflito com o CUDA, para evitar isso desabilite os efeitos visuais
# Sistema -> Preferencias -> Aparencia -> Efeitos Visuais -> Nenhum

# Parte 7
# Alguns exemplos legais
~/NVIDIA_CUDA_SDK/bin/linux/release/nbody
~/NVIDIA_CUDA_SDK/bin/linux/release/particles
~/NVIDIA_CUDA_SDK/bin/linux/release/oceanFFT
~/NVIDIA_CUDA_SDK/bin/linux/release/simpleGL

Se os efeitos parecerem estar dando saltos (algo como lag) pode ser porquê a taxa de quadros por segundo do exemplo não está sincronizada com a do monitor, para corrigir isto habilite a opção “Sync to VBlank”:
Sistema -> Administração -> NVIDIA X Server Settings -> X Screen 0 -> OpenGL Settings -> marque “Sync VBlank”.

# Parte 8
# Comece a programar em CUDA!

Uma forma fácil de criar seu primeiro projeto em CUDA é através do modelo que vem com o SDK. Execute estes comandos para criar um projeto com base no modelo:

cd ~/NVIDIA_CUDA_SDK/projects
cp -r template/ myproject

Crie o projeto dentro da pasta do SDK porquê ele possui dependencias e manter a estrutura de pastas é importante!

Altere o Makefile
cd myproject
gedit Makefile

Mude as linhas:

# Add source files here
EXECUTABLE := template

Para:

# Add source files here
EXECUTABLE := myproject

Para rodar o projeto em modo emulado:
make emu=1
Ou para rodar direto na GPU:
make

Ponha o menino para rodar:
~/NVIDIA_CUDA_SDK/bin/linux/emurelease/myproject
Ou
~/NVIDIA_CUDA_SDK/bin/linux/release/myproject

Bem é isso ae pessoal, aqui na minha máquina funcionou de primeira, qualquer dúvida que tiverem postem ae que talvez eu possa ajudar ou alguém mais experiente possa. Se encontrarem alguma forma mais rápida para instalar me enviem o link que eu colocarei aqui.

Existem alguns sites e tutoriais muito bons na internet que podem ser utilizado como um guia para o aprendizado eis alguns:

http://forums.nvidia.com/
http://www.ddj.com/architect/207200659
http://llpanorama.wordpress.com/2008/06/11/threads-and-blocks-and-grids-oh-my/
http://llpanorama.wordpress.com/2008/05/21/my-first-cuda-program/

Obrigado pela leitura e espero que seja útil!

Blog no WordPress.com. | Tema: Motion até volcanic.
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.