OpenMP循环,每次迭代都取决于之前的

时间:2018-03-12 20:23:14

标签: multithreading parallel-processing openmp

所以我有一个小循环,我正在尝试使用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循环,但在这种情况下我很确定我的程序无法正常工作。

1 个答案:

答案 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。