Как я могу использовать openMP для этого цикла? - PullRequest
2 голосов
/ 29 декабря 2011

Мне интересно, возможно ли сделать этот цикл параллельным с использованием 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 Ответ

4 голосов
/ 29 декабря 2011

Да, это действительно распараллеливание, если ни один из указателей не является псевдонимом.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...