문제는 내부 루프는 예를 들어, 다음 두 명령문은 병렬로 일어날 수, 쓰기 경쟁 조건이 있으므로 있다는 것입니다 : 코드가 각 라인 아래로 비등 무엇
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됩니다
더 경쟁 조건이 없습니다.
감사합니다. <3 루프 감소를 어떻게 사용할 수 있습니까? OpenMP의 이전 버전을 사용하고있어 과부하가되지 않습니다. – StephanieLoves
다른 옵션은 두 개의 루프를 교체하는 것입니다. 'j' 루프는 반복이 더 많으므로 가장 바깥 쪽 루프를 병렬 처리하면 오버 헤드가 줄어 듭니다. –