使用OpenMP并行进行循环

时间:2019-04-03 14:27:27

标签: multithreading parallel-processing openmp

我对OpenMP中的并行for循环代码有问题,并行for循环的结果与顺序for循环不同。如何使此代码与顺序代码并行产生相同的结果。

counter = 0;
#pragma omp parallel for
for(i=0; i<L; i++) {
    int sum_found = 0;
    for(j=0; j<M; j++) {
        int found = 0;
        for(k=0; k<N_SUBSET; k++) {
            if (i==0 && unsorted_arr[j*N_SUBSET + k] < intervals[i]) {
                s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
                counter++;
                found++;
            }
            else if (i!=0 && unsorted_arr[j*N_SUBSET + k] >= intervals[i-1] && unsorted_arr[j*N_SUBSET + k] < intervals[i]) {
                s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
                counter++;
                found++;
            }
            else if (i==L-1 && unsorted_arr[j*N_SUBSET + k] >= intervals[i-1]) {
                s_prime[counter] = unsorted_arr[j*N_SUBSET + k];
                counter++;
                found++;
            }
        }
        C[i][j] = found;
        sum_found += found;
    }
    n_intervals_len[i] = sum_found;
}

1 个答案:

答案 0 :(得分:0)

由于缺少上述代码的某些上下文(尤其是变量声明),因此很难判断出问题所在。但是这里有一些想法:

  • 应该将循环计数器j和k声明为私有,因为否则它们可能存在竞争条件

  • counter++found++语句也是同一个变量上来自不同线程的更新的竞争。您可能必须为它们使用atomic构造,或者使用适当的OpenMP简化来消除竞争条件。