【发布时间】: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 毫秒)才能运行。所以,
- 对于现代硬件 (GL4.3+),本地线程中可变长度的 for 循环是否仍然需要全部完成才能继续,并且
- 如果是这样,为什么第二个代码更慢?
非常感谢。
编辑: df 将为同一个粒子返回无穷大,因此不能选择删除条件表达式。
【问题讨论】:
标签: c++ opengl compute-shader