Arquivo de etiquetas: CUDA


Programmers with little or no exposure to parallelism have an opportunity to learn about multicore programming at the UPCRC Illinois Summer School to be held July 25-29, 2011 at the University of Illinois at Urbana-Champaign.

The week-long, intensive workshop will provide a solid foundation in the fundamentals of multicore programming, offer hands-on experience with the use of multicore languages and libraries, and introduce emerging research topics. Upon completion, participants will be equipped to choose the best multicore programming model for current and future projects.

Prerequisites for the summer school include solid programming experience (C, C++, C# or Java languages) and a demonstrated interest in applying multicore programming to academic or professional pursuits.

For more information about the summer school, visit the website at http://www.upcrc.illinois.edu/summer/2011/index.html.

 

Cheri Helregel, Outreach Coordinator
UPCRC Illinois
University of Illinois at Urbana-Champaign
Ph: (217) 244-6097
url | www.upcrc.illinois.edu

 

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

Os slides em [1] servem como um guia para os primeiros passos em CUDA (instalar driver/toolkit/sdk + primeiro programa + visual profiler).

Primeiros Passos em CUDA

A programação paralela utilizando placas gráficas tem se tornando cada vez mais comum. A maioria dos PCs já vem de fábrica equipados com GPUs com 8, 16, 32… 128 núcleos, até mesmo notebooks já possuem dezenas deles.

Para tornar as coisas ainda mais fáceis, o programador não precisa aprender uma linguagem de programação “exotérica” para aproveitar o potêncial destas placas.  Um exemplo destas linguagens é o CUDA utilizado para programar placas da NVIDIA.

Como já mencionei a programação paralela e a “supercomputação” já não é mais restrita a um grupo de pesquisadores ou indústrias e o potêncial destas placas já está sendo utilizado para resolver problemas de diversas áreas…

Um exemplo intrigante de como as placas gráficas estão sendo utilizadas é o que mencionei no título do post. Com a possibilidade de criar centenas, milhares, milhões de threads em uma GPU, torna-se possível explorar até mesmo as alternativas mais simples (em termos de algoritmo) para se quebrar uma senha. E até mesmo as não tão simples…

Para quem se interessar mais sobre o assunto, este link [1] aponta para uma notícia sobre um projeto de um grupo da “Georgia Tech – USA” que atualmente estão empenhados em quebrar senhas “MD5″ e conseguindo resultados interessantes.

Para se ter o “gostinho” do que há por vir:

“Atualmente nos podemos dizer com certeza que uma senha com sete caracteres é inadequada – e a medida que o poder computacional das GPUS continua a aumentar ano após ano, esta ameaça continuará a aumentar.” [1]

“Para fazer um contraste, no ano de 2000 o supercomputador mais rápido, um cluster custanto em torno de $110 milhões, operava próximo a sete teraflops.” — Atualmente uma placa gráfica pode operar próximo a 2 teraflops. [1]

Mas como comentei, até mesmo alternativas simples como criar a permutação de um conjunto de letras e criptografa-la utilizando MD5 (ou outro) e então comparar com a senha original torna-se viável até um certo comprimento de senha.

Espero que tenham achado interessante como eu achei.

Abraço, JT.

[1] http://www.gtri.gatech.edu/casestudy/Teraflop-Troubles-Power-Graphics-Processing-Units-GPUs-Password-Security-System

Se você como eu tentou compilar um projeto de exemplo do SDK do CUDA fora da pasta de instalação e recebeu uma mensagem de erro similar a estas:

error: cutil_inline.h: No such file or directory

error: cutil.h: No such file or directory

você deve ter se perguntado: será que essa cutil é alguma biblioteca que eu tenho que instalar? E a resposta é: não a cutil como o proprio nome diz é uma biblioteca utilitária, especificamente, é uma biblioteca desenvolvida para facilitar o desenvolvimento dos projetos de exemplo do SDK. Veja abaixo a descrição encontrada no arquivo ~/NVIDIA_GPU_Computing_SDK/C/Common/cutil_readme.txt :

“Note that CUTIL is not part of the CUDA Toolkit and is not supported by NVIDIA.
It exists only for the convenience of writing concise and platform-independent
example code. “

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.