【发布时间】:2020-03-02 14:35:13
【问题描述】:
我有一个 3-D 矢量 F,目前按如下顺序填充:
// for each particle
for(int p = 0; p < pmax; p++) {
// and each dimension (n x m x o)
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
for(int k = 0; k < o; k++) {
// do some calulations depending on p, i, j and k and add onto F
F[i][j][k] += p * i * j * k;
}
}
}
}
F 的值是针对每个粒子递增计算的。
现在我想使用 OpenCL 加快速度。我的第一次尝试是使用 3D-Range-Kernel 并行化内部循环,每个粒子都会调用它。这确实可以正常工作,但在 GPU 上比在 CPU 上更慢(没有应用任何优化 - 例如,F 在每次迭代中从主机复制到 GPU 并再次返回)。
在第二次尝试中,我尝试并行化外循环,这(我认为)比第一次尝试更好,因为 pmax 预计会比 m * n * o 大得多。从我读到的内容,我认为可以使用并行求和减少来解决这个问题,其中有很多例子。但是对于这种方法,我需要为每个不适合内存的线程(或工作项)准备一份F 的副本(在此处获取CL_OUT_OF_RESOURCES)。
我现在的问题是:是否可以并行化这样的增量总和,而无需为多个粒子将F 多次存储在内存中?如果是的话,一个好的方法应该是什么样的?我应该坚持我的第一次尝试并尝试优化它吗?
请注意,我是 OpenCL 新手,对并行化技术的了解并不多。如有任何提示或参考有用的讲座或示例,我将不胜感激,谢谢!
顺便说一句,我在这个主题上的谷歌搜索只会引导我计算前缀总和。
【问题讨论】: