这是我的第一篇文章。我会尽量简短,因为我很重视你的时间。这个社区对我来说非常棒。
我正在学习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核心并使其按预期工作?在这种情况下,障碍将是什么?
function1
和function2
函数? - Z boson