OpenMP用于For循环而不终止并行区域

时间:2018-04-26 14:40:35

标签: c parallel-processing openmp

我在C中使用OpenMP来并行化我的程序。我有这样的代码:

for (num = 0; num < NUM_DATA; num++) {
    for (i = 0; i < NUM_AB; i++) {
        A[i] = some_calc(data[num], B[i]);
    }

    for (i = 0; i < NUM_AB; i++) {
        B[i] = other_calc(A[i]);
    }
}

我将代码并行化为这样的代码:

for (num = 0; num < NUM_DATA; num++) {
    #pragma omp parallel
    {
        #pragma omp for
        for (i = 0; i < NUM_AB; i++) {
            A[i] = some_calc(data[num], B[i]);
        }

        #pragma omp for
        for (i = 0; i < NUM_AB; i++) {
            B[i] = other_calc(A[i]);
        }
    }
}

当我运行并行化代码时,我的运行时间比串行版本差得多。从我所学到的,发生这种情况是因为,在每次num次迭代结束时,创建的并行区域由#pragma omp parallel的右括号终止,但是并行区域必须在下一次num次迭代时再次创建。并行方案类似于this

因此,并行开销(用于创建并行区域)会在每个num循环中命中程序,而不是仅执行一次。有没有办法让程序不为下一个num迭代终止创建的并行区域?还是其他任何解决方法?

我无法将此代码并行化为:

#pragma omp parallel for
for (num = 0; num < NUM_DATA; num++) {
    {
        for (i = 0; i < NUM_AB; i++) {
            A[i] = some_calc(data[num], B[i]);
        }

        for (i = 0; i < NUM_AB; i++) {
            B[i] = other_calc(A[i]);
        }
    }
}

因为Bsome_calc()用于任何num次迭代,取决于之前other_calc()次迭代的num-1

0 个答案:

没有答案