GLSL中数学运算的计算代价

GLSL中数学运算的计算代价,glsl,Glsl,我正在使用GLSL着色器编写一个GPGPU程序,并尝试对N体碰撞检测算法进行一些优化。一种是执行“快速”检查,以确定两个对象是否在同一个球场内。这样做的目的是快速取消很多可能性,这样我只需要对少数物体进行更精确的碰撞测试。如果快速检查确定它们可能发生碰撞,则执行准确检查 对象是圆(或球体)。我知道他们中心的位置和半径。快速检查将查看其方形(或立方体)边界框是否重叠: //make sure A is to the right of and above B //code for that if(

我正在使用GLSL着色器编写一个GPGPU程序,并尝试对N体碰撞检测算法进行一些优化。一种是执行“快速”检查,以确定两个对象是否在同一个球场内。这样做的目的是快速取消很多可能性,这样我只需要对少数物体进行更精确的碰撞测试。如果快速检查确定它们可能发生碰撞,则执行准确检查

对象是圆(或球体)。我知道他们中心的位置和半径。快速检查将查看其方形(或立方体)边界框是否重叠:

//make sure A is to the right of and above B
//code for that

if(A_minX > B_maxX) return false;   //they definitely don't collide
if(A_minY > B_maxY) return false;   //they definitely don't collide

if(length(A_position - B_position) <= A_radius + B_radius){
    //they definitely do collide
    return true;
}
//确保A位于B的右侧和上方
//代码
如果(A_minX>B_maxX)返回false//它们绝对不会碰撞
如果(A_minY>B_maxY)返回false//它们绝对不会碰撞

如果(length(A_position-B_position)当我们讨论成本主题时,这里不需要两个分支。您可以测试组件测试的结果。因此,可以使用
any(大于(A_min,B_max))将其压缩为单个测试一个好的编译器可能会解决这个问题,但是如果你自己考虑数据并行性,它会有帮助。
成本都是相对的。15年前,做
length(…)
所需的算术工作是这样的,你可以在更短的时间内完成立方体贴图纹理查找-在更新的硬件上,你这样做会很疯狂,因为计算比内存快


要全面了解这一点,线程分歧可能比指令或内存吞吐量更成为瓶颈。也就是说,如果并行运行的两个着色器调用在着色器中采用不同的路径,则可能会带来不必要的性能损失。底层硬件架构意味着曾经是优化的安全赌注可能不会在将来出现,甚至可能会导致优化尝试损害性能。

通过比较值的平方,可以避免使用平方根(这是
length()
函数隐含需要的)

然后,测试可以如下所示:

vec3 vDiff = A_position - B_position;
float radSum = A_radius + B_radius;
if (dot(vDiff, vDiff) < radSum * radSum) {
    return true;
}
vec3 vDiff=A_位置-B_位置;
浮点radSum=A_半径+B_半径;
if(点(vDiff,vDiff)

这将它简化为一个测试,但仍然只使用简单有效的操作。

我认为这在很大程度上取决于您的世界状态。如果非常稀疏,许多对象对符合不合格条件,那么是的:应该更快。如果许多对象对需要更精确的检查,那么所有取消资格条件所做的是增加额外的计算工作。你知道要快多少吗?维基百科上有一篇文章描述了各种操作的复杂性,但它是非常通用的:我不知道GLSL中使用了哪些特定的算法。我假设计算平方根是昂贵的,但似乎有一种方法可以实现ximation算法非常快。感谢您提供关于线程差异的提示。编译器和并行处理是我在学校从未接触过的主题。因此,在我的例子中,最好的优化方法可能是尝试这种“优化”方法,然后尝试调用
length()的版本
每次,看看哪一个运行得更快?@Justin:据我所知,大多数本科课程都没有涉及这些主题,这是可以理解的。特别是,大多数关于并行执行的讨论可能仅限于数据危害和同步,除非你专门研究GPU。是的,你可能会microbenchmark(运行测试数千次,直到出现可测量的差异)以了解成本,但直觉上我认为如果有任何差异,也不会有太大的差异。在我看来,分支比
长度(…)更昂贵
在这种情况下。@Justin:但是如果你能找到一个分支条件,它本来就有50/50的成功几率,那么这可能是一个胜利。比如说,如果你90%的数据集没有通过测试,这是一个利用分支来提高性能的好机会。现在有一个聪明的优化。谢谢!