这是我的第一篇文章.我会尽量保持简短,因为我珍惜你的时间.这个社区对我来说太不可思议了.
我正在学习OpenCL,并希望从下面的算法中提取一些并行性.我只会告诉你我正在做的部分,我也尽可能简化了.
1)输入:两个长度为(n)的1D数组:A,B和n的值.还值C [0],D [0].
2)输出:两个长度为(n)的1D阵列:C,D.
C[i] = function1(C[i-1])
D[i] = function2(C[i-1],D[i-1])
Run Code Online (Sandbox Code Playgroud)
所以这些是递归定义,但是给定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]]; …Run Code Online (Sandbox Code Playgroud)