web-dev-qa-db-fra.com

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

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

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

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

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

41
Maik Klein

Règle générale: si vous pouvez le passer à un shader sous la forme d'un uniforme , toujours précalculez sur le CPU; aucune exception. Les calculs du côté shader 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é plus efficacement sur le CPU.

Les GPU ne sont pas des machines magiques "peuvent tout faire plus rapidement". Il existe certaines tâches où un processeur peut facilement surpasser un GPU, même pour de très grands ensembles de données. Donc, une directive très simple est la suivante: si vous pouvez le déplacer vers le CPU sans passer plus de temps CPU à faire le calcul qu'il n'en faut pour le GPU dans les frais généraux pour le traiter, alors faites-le sur le CPU. Le calcul d'une matrice unique fait partie de ces tâches.

63
datenwolf

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

Dans la plupart des cas, un seul calcul peut être effectué plus rapidement sur le CPU que sur le GPU. L'avantage du GPU est qu'il peut effectuer de nombreux calculs en parallèle.

D'un autre côté, cela dépend également de l'emplacement de vos goulots d'étranglement. Si votre CPU fait beaucoup d'autres travaux, mais que vos shaders ne sont pas encore un goulot d'étranglement sur le système cible le moins puissant, vous pouvez facilement voir une amélioration des performances en déplaçant des multiplications de matrice vers le vertex shader.

En règle générale, vous devez éviter tout travail dans le fragment shader qui pourrait également être effectué dans le vertex shader ou sur le CPU, mais au-delà, cela dépend de la situation. À moins que vous ne rencontriez des problèmes de performances, faites-le de la manière la plus simple pour vous, et si vous rencontrez des problèmes de performances, procédez dans les deux sens et profilez les performances pour voir celle qui fonctionne le mieux.

15
bcrist