2011-12-29 4 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

주'것을 - 당신이 그 내부 루프를 대체 할 수 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]; 
} 
다음과 같이 실제로 어느 정도 최적화 할 수

: 내부 루프에서 n2` 어떤 식 으로든 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

관련 문제