Tout en essayant d'améliorer les performances de ma classe de détection de collision, j'ai constaté que ~ 80% du temps passé sur le processeur graphique, il passait sur les conditions if / else à essayer de comprendre les limites des compartiments qu'il devait parcourir.
Plus précisément:
chaque thread obtient un ID, par cet ID, il récupère son triangle dans la mémoire (3 entiers chacun) et par ces 3, il récupère ses sommets (3 flottants chacun).
Ensuite, il transforme les sommets en points de grille entiers (actuellement 8x8x8) et les transforme en bornes triangulaires sur cette grille
Pour transformer les 3 points en bornes, il trouve le min / max de chaque dimension parmi chacun des points
Étant donné que le langage de programmation que j'utilise manque un intrinsèque minmax, j'en ai créé un moi-même, ressemble à ceci:
procedure MinMax(a, b, c):
local min, max
if a > b:
max = a
min = b
else:
max = b
min = a
if c > max:
max = c
else:
if c < min:
min = c
return (min, max)
Donc, en moyenne, il devrait y avoir 2,5 * 3 * 3 = 22,5 comparaisons qui finissent par prendre beaucoup plus de temps que les tests d'intersection triangle-bord réels (environ 100 * 11-50 instructions).
En fait, j'ai trouvé que le pré-calcul des compartiments requis sur le processeur (simple thread, pas de vectorisation), les empilant dans une vue gpu avec la définition du compartiment et faisant le gpu faire ~ 4 lectures supplémentaires par thread était 6 fois plus rapide que d'essayer pour comprendre les limites sur place. (notez qu'ils sont recalculés avant chaque exécution car j'ai affaire à des maillages dynamiques)
Alors pourquoi la comparaison est-elle si horriblement lente sur un GPU?