2012-05-23 3 views
2
내가 병렬화하기 위해 루프 중첩을 코딩하는 것을 시도에 문제가있어

:의 OpenMP - 평행 화 중첩 루프

for(i=0; i<n; i++) 
{ 
    for(j=0; j<n; j++) 
    { 
     if(asubsref(struct1,j) > 0) 
      asubsref(struct2,j) = asubsref(struct3,j) + 1; 
    } 
    for(j=0; j<n; j++) 
     asubsref(struct1,j) = asubsref(struct2,j) - asubsref(struct3,i); 
} 

Struct1/struct2는 너비/높이/INT-float 배열 두 구조체이다 각기. struct3은 float 구조체입니다.

내 시도 두 개의 서로 다른 루프로를 만드는 것이 었습니다하지만 잘못된 결과를 많이 얻을 것 같은 아아, 그것은 작동하지 않았다 지금까지 : 나는 대답을 찾는 게 아니에요

#pragma omp parallel 
{ 
#pragma omp for private(j) 
    for(i=0; i<n; i++) 
    { 
    for(j=0; j<n; j++) 
    { 
     if(asubsref(struct1,j) > 0) 
     asubsref(struct2,j) += 1; 
    } 
    } 
#pragma omp for private(j) 
    for(i=0; i<n; i++) 
    { 
    k = asubsref(struct3,i); 
    for (j=0; j<n; j++) 
    { 
     asubsref(struct1,j) -= k; 
    } 
    } 
} 

을 그러나 이것에 관해 어떻게 가야하는지/대답과 그에 대한 팁을 생각하는 데 도움이되는 몇 가지 지침. 이 코드에서 볼 무엇

+3

'asubref'는 무엇을합니까? – Tudor

+0

또한 asubsref (bin, j) = asubsref (bin, j) + 1;과 asubsref (bin, j) + = 1;은 * 동일한 * 문장입니까? 'asubsref'가 부작용이 있다면, 사실이 아닐 수도 있습니다. – ArjunShankar

+0

무슨 뜻입니까? * OpenMP없이 코드의 * 두 번째 버전을 컴파일 할 때 결과가 정확합니까? – ArjunShankar

답변

4

세 배열입니다 :이 가정이 정확하고 asubsref 어떤 부작용이 발생하지 않는 경우

array1: asubsref(seed,0) ... asubsref(seed,n-1) 
array2: asubsref(bin,0) ... asubsref(bin,n-1) 
array3: asubsref(w,0) ... asubsref(w,n-1) 

, 다음과 같은 불변가 도출 될 수 다음 후

루프의 실행이 끝나면 array2 [j]는 0에서 x까지의 i에 대한 array3 [i] 의 합이 array1 [j]보다 작은 최대 번호 인 x로 증가합니다.

다음은 수행 할 수있는 작업입니다. 지금은 다음과 같은 것이 분명하다

for(i=0; i<n; i++) 
{ 
    for(j=0; j<n; j++) 
    { 
     if(asubsref(seed,j) > 0) 
      asubsref(bin,j) = asubsref(bin,j) + 1; 
     asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i); 
    } 
} 

그런 다음 안쪽을 교환하고 바깥 쪽

for(j=0; j<n; j++) 
{ 
    for(i=0; i<n; i++) 
    { 
     if(asubsref(seed,j) > 0) 
      asubsref(bin,j) = asubsref(bin,j) + 1; 
     asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i); 
    } 
} 

루프 : 첫째, 당신은 자신의 반복은 독립적 인 (우리의 가정에서 ) 이후 두 안쪽 루프를 병합 할 수 있습니다 코드가 작동해야합니다.

#pragma omp parallel for (private i) 
for(j=0; j<n; j++) 
{ 
    for(i=0; i<n; i++) 
    { 
     if(asubsref(seed,j) > 0) 
      asubsref(bin,j) = asubsref(bin,j) + 1; 
     asubsref(seed,j) = asubsref(seed,j) - asubsref(w,i); 
    } 
} 

루프를 분할하면 불변량이 분명히 손상됩니다.

+0

그건 딜레마로 나를 도왔다. 자세한 게시물 덕분에! –