Programação em GPGPU - General Purpose Graphics Processing Unit ou Unidade de Processamento Gráfico de Propósito Geral é aquela que usa da GPU não apenas para tarefas de renderização gráfica, mas também para outras como processamento de imagem, visão computacional, inteligência artificial, cálculo numérico, etc.
Vantagens
- A GPU é um dispositivo massivamente paralelo
- Tem grande desempenho para cálculos aritméticos
- Pode-se encontrar facilmente GPUs com preço acessível, facilitando o acesso à tecnologia
Desvantagens
- Nem todo mundo possui uma GPU em casa
- A GPU não lida bem com código sequencial ou recursivo
- Para as GPUs tradicionais, localizadas a parte do processador há o overhead de passar os dados através do barramento PCI-Express
Principais linguagens para GPGPU
CUDA
CUDA (Compute Unified Device Architetura) é uma linguagem criada pela NVIDIA para a programação GPGPU de suas placas
OpenCL
OpenCL ou Open Compute Language é o padrão aberto para computação heterg
DirectCompute
DirectCompute é a API GPGPU da Microsoft. Ela permite que aplicações que suportem DX 10/11 executem código GPGPU.
C++ AMP
API da Microsoft para facilitar a programação GPGPU em C++. Requer que a placa de vídeo suporte a API DirectCompute.
Link: http://blogs.msdn.com/b/nativeconcurrency/archive/2012/02/03/c-amp-open-spec-published.aspx
Linguagens de tonalização
Comparação de CUDA e OpenCL
Segue abaixo uma tabela que lista a diferença de nomenclatura entre CUDA e OpenCL
CUDA | OpenCL |
Grid | ND Range |
Thread block | Work-group |
Thread | Work-item |
Global Memory | Global Memory |
Constant memory | Constant memory |
Shared memory | Local memory |
Local memory | Private memory |
Espaços de memória
Memória Global
O equivalente da memória RAM a qual a CPU tem acesso. A memória global é a memória que vem junto com as GPUs cuja capacidade é na ordem das centenas de Megabytes ou mesmo alguns Gigabytes. Da mesma forma que a CPU ela é a memória mais lenta e o acesso dela pela GPU demora dezenas/centenas de ciclos de computação.
Memória constante
Memória somente leitura disponível para a GPU.
Memória compartilhada
Memória local (dentro da GPU) que é acessível para as threads e pode ser compartilhada entre as threads que pertencem a um mesmo bloco
Memória local ou privada
Os registradores da GPU. Estes registradores são a memória mais rápida disponível, no entanto, são privativos à thread que está os acessando.
++C++ AMP
Tecnologia a ser lancada no proximo Visual Studio. Consiste em poder expressar o paralelismo de GPUs em programas C++ sem necessitar conhecer detalhes de baixo nível. Como é uma tecnologia da Microsoft, ela usa internamente o DirectCompute.
Maiores informações em http://www.danielmoth.com/Blog/CategoryView,category,GPGPU.aspx
Livros
Programming Massively Parallel Processors
Livro escrito por David Kirk e Wen-mei da Universidade de Illinois sobre como fazer uso do paradigmo da GPGPU
link: http://www.amazon.com/dp/0123814723?tag=wwwnvidiacomc-20&camp=14573&creative=327641&linkCode=as1&creativeASIN=0123814723&adid=1DT2S034DXS37V3K5FFY
Para mais livros em matérias específicas veja CUDA e shaders
Uma lista de livros para GPGPU pode ser encontrada em: http://www.nvidia.com/object/cuda_books.html
Links
Sobre GPGPU
http://www.gpgpu.org
http://www.nvidia.com/object/cuda_get.html (CUDA)
http://www.streamcomputing.eu/blog/
http://www.youtube.com/watch?v=-ROYgRg3x8E Apresentação de Bryan Cantazaro sobre GPUs. vale a pena assitir (em inglês)
Ferramentas
http://multicore.doc.ic.ac.uk/tools/GPUVerify/: GPUVerify - Ferramenta para análise formal de kernels GPU escritos em OpenCL e CUDA