Comment contrôler quels calculs sont effectués sur le CPU et lesquels sont effectués sur le GPU?
14
Ma compréhension actuelle est que tout ce qui est fait dans un fichier shader est fait sur le GPU, et tout ce qui est fait dans mon code (Java, dans mon cas) est fait sur le CPU.
Vous pouvez également faire du calcul sur le GPU en utilisant quelque chose comme OpenCL qui vous permet essentiellement d'exécuter du code sur le GPU.
Soapy
Réponses:
20
Voilà l'essentiel.
En principe, la plate-forme pourrait, en théorie, faire ce qu'elle veut. On pourrait imaginer un système d'exploitation avancé effectuant la traduction juste à temps du code compilé de, disons, x86 en code GPU. De même, les pilotes OpenGL pourraient exécuter tout ce qu'ils veulent sur le CPU hôte.
Mais vraiment, ce que vous venez de décrire, c'est ce qui se passe.
IIRC, les shaders sont compilés sur le CPU avant d'être envoyés au GPU. Et cela se fait par le pilote GPU sans le système d'exploitation.
MSalters
Vrai. J'ai traité de nombreuses erreurs de compilation lors de l'exécution du programme dans les shaders, même lorsque le code java a déjà été compilé.
Bassinator
1
Théorique: Disons que j'avais un programme qui est très gourmand en CPU mais n'était qu'une interface en ligne de commande (pas de travail graphique). Puis-je décharger une partie du travail sur le GPU? Je n'ai pas l'intention de faire ça, c'est juste une chose conceptuelle qui m'intéresse.
Bassinator
2
Oui! Le lien que @return true a publié concerne une bibliothèque Java qui le fait. Plus généralement, vous pouvez écrire un "shader de calcul" en OpenGL, ou utiliser OpenCL. Dans tous les cas, vous devez isoler une partie de votre code qui est parallélisable et lui transmettre des informations. (Les GPU sont généralement parfaits pour les tâches "parallèlement embarrassantes".)
david van brink
1
Un astérisque à ajouter à cette réponse est que certaines implémentations prennent en charge l'idée d'un "pré-shader" - c'est-à-dire un code qui fait partie du shader, mais dont le résultat sera constant à travers toutes les invocations dans un appel de dessin donné (comme la multiplication d'une vue uniforme matrices de projection). Un compilateur de shaders si incliné peut identifier des bits de code comme celui-ci et les extraire pour les exécuter une fois côté CPU, y compris la sortie constante résultante dans le travail soumis au GPU. C'est un cas courant où l'hypothèse "shader = GPU" peut être déformée, mais seulement en détail.
DMGregory
7
Généralement, oui. Java est utilisé pour écrire des programmes qui s'exécutent sur le processeur. Les langages de shader (cg, hlsl, et al) sont utilisés pour écrire des programmes qui s'exécutent sur le GPU.
Une exception à la règle serait d'utiliser des API tierces qui peuvent combler l'écart.
Astuce très intéressante, votre lien vers "aparapi". Exécutez du code JVM sur le GPU ... intrigant!
david van brink
3
david van brink a répondu à votre question en général.
Mais comme il le dit, le pilote OpenGL pourrait exécuter des trucs sur le CPU, et cela arrive souvent. Surtout avec les contextes de compatibilité, où certaines fonctions héritées étranges ne peuvent pas être implémentées sur les cartes graphiques. Ils nécessitent une émulation logicielle. Par exemple, j'ai entendu auparavant que le pointillé était exécuté sur le CPU. Vous pouvez également vous attendre à des surprises avec la cueillette.
Ces surprises peuvent se produire encore plus sur MacOS en utilisant des contextes 2.1, car Apple a unifié assez bien la vue d'OpenGL sur toute sa gamme de matériel, et certains matériels plus petits manquent de choses à émuler. Cela va jusqu'à être réellement possible d'exécuter la spécification ENTIÈRE OpenGL 2.1 entièrement sur CPU, si le code de création de contexte spécifie explicitement un périphérique logiciel.
Inversement, le code qui est exécuté via des bibliothèques informatiques comme vexcl ou boost compute, ou AMP de Microsoft, ou nVidia thrust, PEUT être exécuté sur le GPU ou le CPU en fonction des indicateurs de configuration de l'API.
Et pour la touche finale, à l'intérieur du CPU, vous avez également une architecture DSP avec la partie que nous appelons SIMD. Le compilateur ispc d'Intel fournit une aide à la génération de code qui est "assuré" pour s'exécuter sur des voies SIMD avec de nombreux diagnostics de performances au moment de la compilation pour vous aider à en tirer le meilleur parti. Ajoutez OpenMP à cela et vous pouvez obtenir un SIMD multithread, qui se rapproche des concepts de GPU. Si vous avez un processeur haut de gamme et un GPU bas de gamme, cela peut en fait être plus performant. http://ispc.github.io/
Réponses:
Voilà l'essentiel.
En principe, la plate-forme pourrait, en théorie, faire ce qu'elle veut. On pourrait imaginer un système d'exploitation avancé effectuant la traduction juste à temps du code compilé de, disons, x86 en code GPU. De même, les pilotes OpenGL pourraient exécuter tout ce qu'ils veulent sur le CPU hôte.
Mais vraiment, ce que vous venez de décrire, c'est ce qui se passe.
la source
Généralement, oui. Java est utilisé pour écrire des programmes qui s'exécutent sur le processeur. Les langages de shader (cg, hlsl, et al) sont utilisés pour écrire des programmes qui s'exécutent sur le GPU.
Une exception à la règle serait d'utiliser des API tierces qui peuvent combler l'écart.
la source
david van brink a répondu à votre question en général.
Mais comme il le dit, le pilote OpenGL pourrait exécuter des trucs sur le CPU, et cela arrive souvent. Surtout avec les contextes de compatibilité, où certaines fonctions héritées étranges ne peuvent pas être implémentées sur les cartes graphiques. Ils nécessitent une émulation logicielle. Par exemple, j'ai entendu auparavant que le pointillé était exécuté sur le CPU. Vous pouvez également vous attendre à des surprises avec la cueillette.
Ces surprises peuvent se produire encore plus sur MacOS en utilisant des contextes 2.1, car Apple a unifié assez bien la vue d'OpenGL sur toute sa gamme de matériel, et certains matériels plus petits manquent de choses à émuler. Cela va jusqu'à être réellement possible d'exécuter la spécification ENTIÈRE OpenGL 2.1 entièrement sur CPU, si le code de création de contexte spécifie explicitement un périphérique logiciel.
Inversement, le code qui est exécuté via des bibliothèques informatiques comme vexcl ou boost compute, ou AMP de Microsoft, ou nVidia thrust, PEUT être exécuté sur le GPU ou le CPU en fonction des indicateurs de configuration de l'API.
Et pour la touche finale, à l'intérieur du CPU, vous avez également une architecture DSP avec la partie que nous appelons SIMD. Le compilateur ispc d'Intel fournit une aide à la génération de code qui est "assuré" pour s'exécuter sur des voies SIMD avec de nombreux diagnostics de performances au moment de la compilation pour vous aider à en tirer le meilleur parti. Ajoutez OpenMP à cela et vous pouvez obtenir un SIMD multithread, qui se rapproche des concepts de GPU. Si vous avez un processeur haut de gamme et un GPU bas de gamme, cela peut en fait être plus performant.
http://ispc.github.io/
la source