Mientras intentaba mejorar el rendimiento de mi clase de detección de colisión, descubrí que ~ 80% del tiempo que pasaba en la gpu, lo dedicaba a las condiciones de si / de lo contrario solo intentaba descubrir los límites de los cubos por los que debería pasar.
Más precisamente:
cada hilo obtiene una ID, por esa ID obtiene su triángulo de la memoria (3 enteros cada uno) y por esos 3 obtiene sus vértices (3 flota cada uno).
Luego transforma los vértices en puntos de cuadrícula entera (actualmente 8x8x8) y los transforma en los límites del triángulo en esa cuadrícula
Para transformar los 3 puntos en límites, encuentra el mínimo / máximo de cada dimensión entre cada uno de los puntos
Como al lenguaje de programación que estoy usando le falta un mínimo intrínseco, lo hice yo mismo, se ve así:
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)
Entonces, en promedio, debería ser 2.5 * 3 * 3 = 22.5 comparaciones que terminan consumiendo mucho más tiempo que las pruebas reales de intersección triángulo-borde (alrededor de 100 * 11-50 instrucciones).
De hecho, descubrí que calcular previamente los cubos necesarios en la CPU (subproceso único, sin vectorización), apilarlos en una vista de gpu junto con la definición del cubo y hacer que el gpu haga ~ 4 lecturas adicionales por hilo fue 6 veces más rápido que intentarlo para descubrir los límites en el acto. (tenga en cuenta que se vuelven a calcular antes de cada ejecución ya que estoy tratando con mallas dinámicas)
Entonces, ¿por qué la comparación es tan terriblemente lenta en una gpu?