GPGPU

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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.