如何在这个循环中使用openMP?

时间:2011-12-29 00:35:37

标签: c++ multithreading openmp

我想知道使用openMP使这个循环并行是否可行。

粗略的是竞争条件存在问题。我不确定如何处理由外循环生成的内循环中的n,以及其中D = A [n]的竞争条件。您是否认为尝试使其平行是切实可行的?

for(n=0; n < 10000000; ++n) {   

    for (n2=0; n2< 100; ++n2) {
        A[n]=A[n]+B[n2][n+C[n2]+200];

        }

    D=D+A[n];

}

1 个答案:

答案 0 :(得分:4)

是的,假设没有指针是别名的,这确实可以并行化。

int D = 0;  //  Or whatever the type is.

#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {   

    for (n2 = 0; n2 < 100; ++n2) {
        A[n] = A[n] + B[n2][n + C[n2] + 200];
    }

    D += A[n];
}

实际上可以如下进行优化:

int D = 0;  //  Or whatever the type is.

#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {   

    int tmp = A[n]
    for (n2 = 0; n2 < 100; ++n2) {
        tmp += B[n2][n + C[n2] + 200];
    }

    A[n] = tmp;
    D += tmp;
}