2017-12-04 7 views
0
#pragma omp parallel for  
for (int i = 0; i <500; i++) 
    for (j=i; j < 102342; j++) 
    { 
     Output[j] += staticConstant[i] * data[j-i]; 
    } 
} 

일부 벡터 응답은 동일하고 일부는 다릅니다. 이것에 대한 이유는 무엇일까요? 처음에는 플로팅으로 인한 것일 수 있다고 생각했기 때문에 모든 것을 두 배로 바꿨습니다. 5-6 개의 대답이 동일하거나 큰 값의 블록이 매우 가깝고 몇 개의 블록이 아주 멀리 떨어져있을 것입니다.병렬 처리 할 때 다른 대답

답변

1

Output[j]에 쓰는 스레드가 여러 개 있습니다. 이로 인해 경쟁 조건이 발생합니다. 한 스레드에서 쓰여진 값은 다른 값을 가진 다른 스레드로 대체됩니다.

1

문제는 내부 루프는 예를 들어, 다음 두 명령문은 병렬로 일어날 수, 쓰기 경쟁 조건이 있으므로 있다는 것입니다 : 코드가 각 라인 아래로 비등 무엇

Output[42] = Output[42] + staticConstant[9] * data[42-9]; 
Output[42] = Output[42] + staticConstant[19] * data[42-19]; 

은 다음과 같습니다

Load O[42] to R1 
Load C[] to R2 
Add R2 to R1 
Store R1 to O[42] 

그러나, paralleliser는 다음과 같이 실행 코드가 발생할 수 있습니다 :

Load O[42] to R1 
Load O[42] to R3 
Load C[9] to R2 
Load C[19] to R4 
Add R2 to R1 
Add R4 to R3 
Store R1 to O[42] 
Store R3 to O[42] 

두 개의 Load O[42] 라인은 C[9] 또는 C[19]을 추가하기 전에 값을로드하므로 실제로는 첫 번째 계산이 무시됩니다.

가장 쉬운 수정은 다음과 같습니다

for (int i = 0; i <500; i++) 
{ 
#pragma omp parallel for  
    for (j=i; j < 102342; j++) 
    { 
     Output[j] += staticConstant[i] * data[j-i]; 
    } 
} 

이제 단지 내부 루프가 parallelised됩니다

더 경쟁 조건이 없습니다.

+0

감사합니다. <3 루프 감소를 어떻게 사용할 수 있습니까? OpenMP의 이전 버전을 사용하고있어 과부하가되지 않습니다. – StephanieLoves

+0

다른 옵션은 두 개의 루프를 교체하는 것입니다. 'j' 루프는 반복이 더 많으므로 가장 바깥 쪽 루프를 병렬 처리하면 오버 헤드가 줄어 듭니다. –