Como controle quais cálculos são feitos na CPU e quais são feitos na GPU?

14

Meu entendimento atual é que tudo o que é feito em um arquivo shader é feito na GPU, e tudo o que é feito no meu código (Java, no meu caso) é feito na CPU.

Esta é uma descrição precisa?

Bassinator
fonte
2
Além disso, você pode fazer computação na GPU usando algo como o OpenCL, que basicamente permite executar o código na GPU.
Ensaboado

Respostas:

20

Essa é a essência disso.

Em princípio, a plataforma poderia, concebivelmente, fazer o que quisesse. Pode-se imaginar um sistema operacional avançado fazendo a tradução just-in-time do código compilado, por exemplo, do código x86 para o GPU. Da mesma forma, os drivers OpenGL podem executar o que quiser na CPU host.

Mas, realmente, o que você acabou de descrever é o que acontece.

david van brink
fonte
5
IIRC, os shaders são compilados na CPU antes de serem enviados para a GPU. E isso é feito pelo driver da GPU sem o sistema operacional.
MSalters
Verdade. Eu lidei com muitos erros de compilação durante a execução do programa nos shaders, mesmo quando o código java já foi compilado.
Bassinator
1
Teórico: Digamos que eu tenha um programa que consome muita CPU, mas que seja apenas uma interface de linha de comando (sem trabalho gráfico). Posso descarregar parte do trabalho para a GPU? Na verdade, não estou pensando em fazer isso, é apenas uma coisa conceitual que me interessa.
Bassinator
2
Sim! O link que @return true postou é para uma biblioteca Java que faz isso. De maneira mais geral, você pode escrever um "sombreador de computação" no OpenGL ou usar o OpenCL. Em todos os casos, você precisa isolar parte do seu código que seja paralelamente agradável e passar informações para dentro e para fora dele. (GPUs são principalmente grandes para tarefas "embaraçosamente paralelo".)
david van brink
1
Um asterisco a ser adicionado a essa resposta é que algumas implementações apóiam a ideia de um "preshader" - ou seja, código que faz parte do shader, mas cujo resultado será constante em todas as chamadas em uma determinada chamada de empate (como multiplicar a exibição uniforme e matrizes de projeção). Um compilador de shader tão inclinado pode identificar bits de código como este e elevá-los para serem executados uma vez no lado da CPU, incluindo a saída constante resultante no trabalho enviado à GPU. Esse é um caso comum em que a suposição "shader = GPU" pode ser dobrada, embora apenas em detalhes.
DMGregory
7

Geralmente sim. Java é usado para escrever programas que são executados na CPU. Linguagens de sombreador (cg, hlsl, et al) são usadas para escrever programas executados na gpu.

Uma exceção à regra seria usar APIs de terceiros que possam preencher a lacuna.

retornar verdadeiro
fonte
1
Dica muito interessante, o seu link para "aparapi". Execute algum código da JVM na GPU ... intrigante!
David van brink
3

david van brink respondeu à sua pergunta em geral.

Mas, como ele diz, o driver OpenGL pode executar coisas na CPU, e isso realmente acontece muito. Especialmente em contextos de compatibilidade, onde algumas funções herdadas estranhas não podem ser implementadas nas placas gráficas. Eles exigem emulação de software. Por exemplo, eu ouvi falar antes que o pontilhado seja executado na CPU. Você também pode esperar surpresas com a escolha.
Essas surpresas podem acontecer ainda mais no MacOS usando contextos 2.1, porque a Apple unificou bastante a visão do OpenGL em toda a sua gama de hardwares, e alguns hardwares menores carecem de algumas coisas que precisam ser emuladas. É o máximo possível para executar a especificação INTEIRA OpenGL 2.1 totalmente na CPU, se o código de criação de contexto especificar um dispositivo de software explicitamente.

Por outro lado, o código executado através de bibliotecas de computação, como vexcl ou boost comput, ou o AMP da Microsoft, ou o nVidia thrust, PODE ser executado na GPU ou na CPU, dependendo dos sinalizadores de configuração da API.

E para o toque final, dentro da CPU, você também tem uma arquitetura DSP com a parte que chamamos de SIMD. O compilador ispc da Intel fornece ajuda na geração de código "garantido" para execução em pistas SIMD com muitos diagnósticos de desempenho em tempo de compilação para ajudá-lo a aproveitar ao máximo. Adicione o OpenMP a isso e você poderá obter o SIMD multithread, que aborda os conceitos de GPUs. Se você possui uma CPU de ponta e uma GPU de ponta, isso pode ser mais eficiente.
http://ispc.github.io/

v.oddou
fonte