所以我有一个小循环,我正在尝试使用OpenMP进行并行化。我面临的问题是每次迭代都取决于前一次的结果。看看下面的代码:
for(int i=1; i < N; i++) {
for(int j=0; j < M; j++) {
A[i][j] = A[i-1][j];
if(x[i] <= j)
A[i][j] += A[i-1][j-x[i]];
}
}
如您所见,我的输出取决于A[i][j]
之前输入的结果。另一件需要注意的事情是我在进入循环之前初始化了A[0][j]
。
有人可以帮我解决这个问题吗?
编辑:我知道你必须使用#pragma omp parallel for
for循环,但在这种情况下我很确定我的程序无法正常工作。
答案 0 :(得分:0)
您无法按原样并行化最外层循环。每个线程都需要拥有&#34;数组的一部分,否则你将引入比赛。
正如您所提到的,从迭代i到迭代i-1存在数据依赖性。循环的每个迭代器都可以按任何顺序发生,这种依赖引入了竞争。
Step 1
T0 T1
i=1 i=2
A[1][j] = A[0][j] A[2] = A[1][j]
// T0 writes to A[1][j] while T1 reads A[1][j]
假设A的形状为A[N][M]
,则内环可以平行。在这种情况下,A中只有2行将被访问,i和i-1。不再存在数据依赖性,因为j循环是并行的而不是i。