【问题标题】:Parallel For Loop with OpenMP使用 OpenMP 的并行 For 循环
【发布时间】:2019-04-03 14:27:26
【问题描述】:

我在 OpenMP 中并行 for-loop 代码有问题,并行 for-loop 的结果与顺序 for-loop 不同。如何使此代码与顺序代码具有相同的结果。

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

【问题讨论】:

  • 您是否尝试过启用 thread-sanitizer 进行编译?
  • 我只是用 GCC 和 OpenMP 编译
  • 尝试添加-fsanitize=thread。它会告诉您是否以及在哪里进行数据竞赛

标签: multithreading parallel-processing openmp


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多