Introdução à programação da GPU [fechado]


176

Todo mundo tem esse supercomputador imensamente paralelo em sua área de trabalho na forma de uma GPU de placa gráfica.

  • Qual é o "olá mundo" equivalente da comunidade da GPU?
  • O que devo fazer, para onde vou, para começar a programar a GPU para os principais fornecedores de GPU?

-Adão


1
Você está falando sobre GPGPU ou codificação gráfica?
Menkboy 20/10/08

5
Ele está falando sobre CUDA (uma API para GPUs nVidia) e outras técnicas. Usando as unidades FPU disponíveis nas GPUs para codificação não gráfica.
04 de

1
Para referência, uma GeForce 8800 de última geração possui 128 processadores de fluxo operando a ~ 1,3 GHz, um GTX 280 topo de linha tem 240 processadores de fluxo, o desempenho teórico dessas GPUs é de 0,5 e 0,9 TeraFLOPS, respectivamente.
04

Respostas:



17
  1. Você obtém sombreadores programáveis ​​de vértice e pixel que permitem a execução de código diretamente na GPU para manipular os buffers a serem desenhados. Esses idiomas (por exemplo, GL Shader Lang do OpenGL e Shader Lang de alto nível e equivalentes do DirectX), são sintaxe no estilo C e muito fáceis de usar. Alguns exemplos de HLSL podem ser encontrados aqui para o XNA game studio e o Direct X. Eu não tenho nenhuma referência GLSL decente, mas tenho certeza de que há muita coisa por aí. Essas linguagens de sombreador fornecem uma quantidade imensa de poder para manipular o que é desenhado no nível por vértice ou por pixel, diretamente na placa gráfica, facilitando a implementação de coisas como sombras, iluminação e flor.
  2. A segunda coisa que vem à mente é usar o openCL para codificar as novas linhas de GPUs de uso geral. Não tenho certeza de como usar isso, mas meu entendimento é que o openCL fornece o começo de poder acessar processadores na placa de vídeo e na CPU normal. Ainda não é uma tecnologia convencional e parece ser impulsionada pela Apple.
  3. CUDA parece ser um tópico quente. CUDA é a maneira da nVidia de acessar a energia da GPU. Aqui estão algumas introduções

9

Acho que os outros responderam sua segunda pergunta. Quanto ao primeiro, o "Olá Mundo" da CUDA, não acho que exista um padrão definido, mas pessoalmente recomendo um somador paralelo (isto é, um programa que soma N números inteiros).

Se você observar o exemplo de "redução" no NVIDIA SDK, a tarefa superficialmente simples poderá ser estendida para demonstrar várias considerações sobre CUDA, como leituras combinadas, conflitos no banco de memória e desenrolamento de loop.

Veja esta apresentação para mais informações:

http://www.gpgpu.org/sc2007/SC07_CUDA_5_Optimization_Harris.pdf


7

Dê uma olhada no SDK da ATI Stream Computing . É baseado no BrookGPU desenvolvido em Stanford.

No futuro, todo o trabalho da GPU será padronizado usando o OpenCL . É uma iniciativa patrocinada pela Apple que será neutra em relação aos fornecedores de placas gráficas.


7

O OpenCL é um esforço para tornar uma biblioteca multiplataforma capaz de programar código adequado para, entre outras coisas, GPUs. Ele permite escrever o código sem saber em qual GPU ele será executado, facilitando assim o uso de parte do poder da GPU, sem atingir especificamente vários tipos de GPU. Suspeito que não seja tão eficiente quanto o código nativo da GPU (ou tão nativo quanto os fabricantes da GPU permitirão), mas a troca pode valer a pena para alguns aplicativos.

Ele ainda está nos estágios relativamente iniciais (1.1 a partir desta resposta), mas ganhou alguma força no setor - por exemplo, é suportado nativamente no OS X 10.5 e superior.


6

CUDA é uma excelente estrutura para começar. Permite escrever kernels GPGPU em C. O compilador produzirá microcódigo GPU a partir do seu código e enviará tudo o que é executado na CPU para o seu compilador comum. É apenas NVIDIA e funciona apenas em placas da série 8 ou melhor. Você pode conferir a zona CUDA para ver o que pode ser feito com ela. Existem algumas demos excelentes no CUDA SDK . A documentação que acompanha o SDK é um bom ponto de partida para escrever código. Ele orientará você a escrever um kernel de multiplicação de matrizes, que é um ótimo lugar para começar.


5

Outra maneira fácil de entrar na programação de GPU, sem entrar no CUDA ou no OpenCL, é através do OpenACC .

O OpenACC funciona como o OpenMP, com diretivas do compilador (como #pragma acc kernels) para enviar trabalho para a GPU. Por exemplo, se você tem um loop grande (somente os maiores são realmente beneficiados):

int i;
float a = 2.0;
float b[10000];
#pragma acc kernels
for (i = 0; i < 10000; ++i) b[i] = 1.0f;
#pragma acc kernels
for (i = 0; i < 10000; ++i) {
  b[i] = b[i] * a;
}

Edit: infelizmente, apenas o compilador PGI realmente suporta o OpenACC agora, para placas de GPU NVIDIA.


3

Experimente GPU ++ e libSh

O link LibSh tem uma boa descrição de como eles vinculam a linguagem de programação às primitivas gráficas (e, obviamente, as próprias primitivas), e o GPU ++ descreve o que é tudo isso, ambos com exemplos de código.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.