2012-03-27 4 views
-1

openmp를 사용하여 두 개의 루프를 병렬 처리 할 때 문제가 있습니다.종속 루프 최적화 openmp

void test(float** m,tab* t,int n){ 

    int i,j; 
    float gain; 
    for (i = 1; i < n; i++) 
    { 
     for (j = i + 1;] j < n; j++) 
     { 
      if (i != j) 
      { 
       gain=m[t[(i+n-1)%n]][t[j]] + m[t[i]][t[(j+1)%n]] - m[t[(i+n -1)%n]][t[i]] - m[t[j]][t[(j+1)%n]] 
       if (gain< 0) 
       { 
        swapTab(t,i,j); 
       } 
      } 
     } 
    } 
} 

들으 :

에서는 OpenMP를이 루프를 최적화 할 수 있습니다.

+1

첫 번째 것은'if (i! = j)'를 제거하는 것입니다 ... –

+0

'swapTab'는 무엇을합니까? –

+0

배열의 2 요소를 스왑합니다. – Arkerone

답변

1

Oli Charlesworth가 여러분의 행렬에있는 요소의 순회 순서가 중요하므로, 가장 바깥 쪽 루프를 둘러싼 병렬 지시어를 단순히 두드리는 것은 효과가 없을 것입니다.

한 가지 옵션은 시간을두고 약간의 공간을 교환하는 것입니다. 배열 T 사본을 만드십시오 (T'). 반복 1에서 당신의 라인을 대체 할 :

T'[j][i] = T[i][j] 

같은 뭔가

swapTab(t,i,j) 

을 (나는 C의 많은 아니에요 ++ 프로그래머는 이렇게 구문의 결함을 무시하십시오.)에서

두 번째 반복은 먼저 T'T으로 복사 한 다음 계속 수행해야합니다. 그렇게하지 마십시오 - TT'에 (Tnew, Told, 아마도) 포인터를 설정하고 Told 항상 읽을 수 있도록 배열을 가리키는 그래서 주위에 포인터를 전환하고, Tnew 항상 쓸 수 배열을 가리키는.