2011-10-26 2 views
3

내부 루프로 루프를 병렬 처리하려고합니다. 내 코드는 다음과 같습니다 :OpenMP : 중첩 된 루프를 병렬 처리 할 수 ​​없습니다.

#pragma omp parallel for private(jb,ib) shared(n, Nb, lb, lastBlock, jj, W, WT) schedule(dynamic) //private(ib, jb) shared(n, Nb, lb, lastBlock, jj, W, WT)  //parallel for loop with omp 
    for(jb=0; jb<Nb; jb++)   
    { 
      int lbh = (jb==Nb-1) ? lastBlock : lb; 
      int ip = omp_get_thread_num(); 

      packWT(a, n, lb, s, jb, colNr, WT[ip], nr); //pack WWT[jb]  


      for(ib=jb; ib<Nb; ib++) 
      { 
        int lbv = (ib==Nb-1) ? lastBlock : lb; 

        multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh); //MULT BLOCK - 2x4xK (W[jb]*W[ib]) 

      } 
    } 

이 루프 계산에 소요 된 시간을 측정합니다. 하나의 쓰레드와 같은 쓰레드도 마찬가지입니다. 내가

private(jb) 

모두를위한 절

private(jb,ib) 

을 변경하는 경우 변경되고있다. 몇 가지 스레드 proc에 대한 하나의 스레드를보다 빠르게 계산하는 것을 의미합니다. 문제가 무엇입니까?

+0

여기에 더 많은 것을 할 필요가 없습니다. 무엇이 packWT, multblock, a 등입니까? -하지만 ib가 비공개가되도록해야합니다. 그렇지 않으면 스레드가 동일한 루프 색인을 겹쳐 쓰게됩니다. 사적인 (ib)없이 빠르다는 이유는 아마도 많은 ib가 그것없이 건너 뛴다는 것입니다 ... –

+0

사실 개인 (ib)없이 나는 잘못된 결과를 얻습니다. 많은 시간 동안 왜 시간이 같은지 여전히 알지 못합니다. 하나의 스레드가 ... – Pelsono

+0

많은 이유가있을 수 있지만, 우리 중 누구도 더 이상의 정보 없이는 아무 것도 말할 수 없습니다. –

답변

4

문제는 내부 for 루프가 정식 모양이 아님을 나타냅니다. 따라서 openmp는 루프를 병렬 처리하지 못하고 속도 향상을 달성 할 수 없습니다. 루프는 다음 그림과 같아야합니다. 여기서 start, idx 및 inc는 코드의 병렬 부분에서 변경할 수 없습니다. canonical shape of for loops

나는 당신의 문제를 확인했다고 생각합니다. 이러한 함수를 호출 : JB가 (함수 선언에 따라 다름) 함수 내에서 변경 될 수있는 하나 개의 인수가 루프 변수 JB가있다

packWT(a, n, lb, s, jb, colNr, WT[ip], nr); packWT(a, n, lb, s, jb, colNr, WT[ip], nr); 
    multBlock_2x4xk(a, n, jj + ib*lb, jj + jb*lb, W+ib*lb*lb, WT[ip], lb, lbv, lbh); 

는, 컴파일러는 루프를 병렬화하지 않기로 결정. 이것을 피하려면 변수 jb를 로컬 변수에 복사하고 함수에 로컬 변수를 건네줍니다.