繁体   English   中英

OpenGL Compute着色器更快地分离循环

[英]OpenGL Compute shader seperate for loops faster

我最近开始涉足GPGPU,并编写了一个MD模拟程序作为类分配。 从其他粒子计算力的部分如下。

vec3 pn = poss[gid].xyz;
vec3 f = vec3(0, 0, 0);
for (uint i = 0; i < gid; i++) {
    f += df(pn, poss[i].xyz);
}
for (uint i = gid+1; i < num; i++) {
    f += df(pn, poss[i].xyz);
}
fors[gid].xyz = f;

在GTX960上使用32000个实例(500个线程)运行此代码需要50毫秒。

我的老师建议合并两个循环,因为线程同步(?)会导致执行时间较长。 所以我将其更改为如下。

for (uint i = 0; i < num; i++) {
    if (i != gid) f += df(pn, poss[i].xyz);
}

但是,这需要65毫秒(长15毫秒)才能运行。 所以,

  1. 的确,对于现代硬件(GL4.3 +),对于本地线程中可变长度的循环,仍需要在继续之前全部完成,并且
  2. 如果是这样,为什么第二个代码比较慢?

非常感谢你。

编辑: df将为同一粒子返回无穷大,因此删除条件表达式不是一个选择。

1)好吧,我仍然是计算着色器的新手,但我认为是。 如果单个工作组中的不同调用对循环执行变量lenth,则某些线程可能更早完成,并且将不得不等待,直到所有线程在该特定工作组中完成执行。 之后,工作组可能会交换为另一个未处理的工作组。

2)因为两个代码不相同。 等效地,我的意思是相同的陈述。 上面的有2个循环。 下面的代码有1个大循环,其中带有“ if”语句。 所以我的猜测是If语句导致更长的运行时间。

如果您可以通过在索引gid数组poss中添加另一个向量来删除“ If”语句,以便在处理gid将处理后添加到f的向量为vec3(0,0,0) ,那么我认为它将改善执行时间处理时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM