【问题标题】:OpenGL Compute shader seperate for loops fasterOpenGL Compute shader 分开 for 循环更快
【发布时间】:2017-12-24 17:28:55
【问题描述】:

我最近开始研究 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 毫秒。

我的导师建议合并 2 个循环,因为线程同步(?)会导致执行时间过长。所以我把它改成如下。

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

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

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

非常感谢。

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

【问题讨论】:

    标签: c++ opengl compute-shader


    【解决方案1】:

    1) 好吧,我对计算着色器还是很陌生,但我认为是的。如果单个工作组中的不同调用执行变量 lenth for 循环,那么某些线程可能已经提前完成,并且必须等到所有线程在该特定工作组中完成执行。之后,工作组可能会换成另一个未处理的工作组。

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2011-06-13
      • 2014-01-02
      相关资源
      最近更新 更多