2011-12-29 5 views
2

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

} 
+0

Заметим, что 'n2' во внутреннем цикле не зависит от' n' в любом случае - вы могли бы заменить внутренний цикл с 100 явно написанными строками без проблем ... – sarnold

ответ

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

'(+: D)' выглядит как смайлик ... тьфу, не может не заметить. – Xeo

+1

Не моя идея использовать 'D'. :) Но я думаю, что есть много других, которые вы могли бы использовать: '(+: P)', '(+: O)', '+: XD' ... – Mysticial

+0

LOL. вы также могли бы использовать '(+: vI)'. Спасибо за помощь, на самом деле это было очень просто. К сожалению, моя программа занимает больше времени, чтобы выполнить с помощью omp в этом случае. – MVTC

Смежные вопросы