Dois-je calculer des matrices sur le GPU ou sur le CPU?

devrais-je préférer calculer des matrices sur le CPU ou le GPU?

disons que j'ai les matrices suivantes P * V * M, devrais-je les calculer sur le CPU pour pouvoir envoyer la matrice finale au GPU (GLSL) ou devrais-je envoyer ces trois matrices séparément au GPU pour que le GLSL puisse calculer la matrice finale?

je veux dire que dans ce cas, GLSL devrait calculer la matrice MVP pour chaque vertex, donc il est probablement plus rapide de la précalculer sur le CPU.

mais disons que GLSL n'a à calculer la matrice he MVP qu'une seule fois, le GPU calculerait-il la matrice finale plus rapidement que le CPU?

36
demandé sur Maik Klein 2013-05-18 06:03:30

2 réponses

règle Générale: Si vous pouvez passer à un shader en forme de uniforme, toujours précalculer sur la CPU; pas d'exceptions. Les calculs du côté de l'ombre n'ont de sens que pour les valeurs qui varient entre les sommets et les fragments. Tout ce qui est constant parmi un lot entier de Sommets est traité le plus efficacement sur le CPU.

les GPU ne sont pas des machines magiques qui "peuvent tout faire plus rapidement". Il y a certaines tâches où un CPU peut facilement dépasser un GPU, même pour de très grands ensembles de données. Donc, une ligne directrice très simple est: si vous pouvez le déplacer à L'unité centrale sans passer plus de temps à faire le calcul que cela prend pour le GPU dans les frais généraux totaux pour le traiter, puis le faire sur L'UNITÉ CENTRALE. Le calcul d'une matrice unique fait partie de ces tâches.

56
répondu datenwolf 2013-05-18 08:24:06

comme la plupart des situations avec OpenGL, cela dépend.

dans la plupart des cas, un seul calcul peut être fait plus rapidement sur le CPU que sur le GPU. L'avantage du GPU est qu'il peut faire beaucoup de calculs en parallèle.

d'un autre côté, cela dépend aussi de l'emplacement de vos goulots d'étranglement. Si votre CPU fait beaucoup d'autres travaux, mais vos shaders ne sont pas encore un goulot d'étranglement sur le système cible le moins puissant, alors vous pourriez facilement voir une certaine amélioration de la performance en déplaçant certains Matrix multiplications au vertex shader.

généralement, vous devriez éviter tout travail dans le shader de fragment qui pourrait aussi être fait dans le shader de vertex ou sur le CPU, mais au-delà de cela, cela dépend de la situation. À moins que vous ne rencontriez des problèmes de performance, faites-le simplement de la manière la plus facile pour vous, et si vous avez des problèmes de performance, faites-le de deux façons et profilez la performance pour voir ce qui fonctionne mieux.

13
répondu bcrist 2013-05-18 07:04:32