在尝试提高碰撞检测类的性能时,我发现在gpu上花费了大约80%的时间,它花费在if / else条件上只是试图弄清楚应该循环通过的存储桶的界限。
更确切地说:
每个线程都有一个ID,通过该ID从内存中获取其三角形(每个3个整数),并通过这3个线程获取其顶点(每个3个浮点)。
然后将顶点转换为整数网格点(当前为8x8x8),并将其转换为该网格上的三角形边界
要将3个点转换为边界,它会在每个点中找到每个维度的最小值/最大值
由于我使用的编程语言缺少minmax内在函数,因此我自己做了一个代码,看起来像这样:
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)
因此,平均而言,应该是2.5 * 3 * 3 = 22.5个比较,这比实际的三角形-边缘相交测试(大约100 * 11-50条指令)消耗的时间更多。
实际上,我发现在cpu上预先计算所需的存储桶(单线程,无向量化),将它们与gpu定义一起存储在gpu视图中,并使gpu每个线程进行约4次额外读取,比尝试快6倍。找出当场的界限。(请注意,由于我要处理动态网格物体,因此在每次执行之前都要重新计算它们)
那么,为什么在GPU上进行比较却如此缓慢呢?