首页 > 解决方案 > 使用 OpenMP 的并行 For 循环

问题描述

我对 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;
}

标签: multithreadingparallel-processingopenmp

解决方案


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

  • 循环计数器 j 和 k 应该被声明为私有的,否则你可能会对它们产生竞争条件

  • counter++andfound++语句也是来自不同线程对同一变量的更新的竞争。您要么必须atomic为它们使用构造,要么使用适当的 OpenMP 缩减来摆脱竞争条件。


推荐阅读