这是我的第一篇文章。我会尽量保持简短,因为我珍惜你的时间。这个社区对我来说太不可思议了。
我正在学习 OpenCL,想从下面的算法中提取一点并行性。我只会向您展示我正在处理的部分,我也尽可能地简化了它。
1) 输入:两个长度为 (n) 的一维数组:A、B 和 n 的值。还有值 C[0]、D[0]。
2) 输出:两个长度为 (n) 的一维数组:C、D。
C[i] = function1(C[i-1])
D[i] = function2(C[i-1],D[i-1])
所以这些是递归定义,但是对于给定的 i 值的 C & D 的计算可以并行完成(它们显然更复杂,以便有意义)。一个天真的想法是为以下内核创建两个工作项:
__kernel void test (__global float* A, __global float* B, __global float* C,
__global float* D, int n, float C0, float D0) {
int i, j=get_global_id(0);
if (j==0) {
C[0] = C0;
for (i=1;i<=n-1;i++) {
C[i] = function1(C[i-1]);
[WAIT FOR W.I. 1 TO FINISH CALCULATING D[i]];
}
return;
}
else {
D[0] = D0;
for (i=1;i<=n-1;i++) {
D[i] = function2(C[i-1],D[i-1]);
[WAIT FOR W.I. 0 TO FINISH CALCULATING C[i]];
}
return;
}
}
理想情况下,两个工作项(数字 0,1)中的每一个都将进行一次初始比较,然后进入它们各自的循环,为每次迭代同步。现在考虑到 GPU 的 SIMD 实现,我假设这将不起作用(工作项将等待所有内核代码),但是是否可以将这种类型的工作分配给两个 CPU 内核并使其按预期工作?在这种情况下,障碍是什么?