2013-04-19 7 views
0

병렬 내부 동기화 I이의 OpenMP : 1) 스레드 정량 스폰 :

void h(particles *p) {  
    #pragma omp parallel for 
    for (int i = 0; i < maxThreads; ++i) { 
     int id = omp_get_thread_num(); 
     for (int j = 0; j < dtnum; ++j) { 
      f(p, id); 
      if (j % 50 == 0) { 
       if (id == 0) { 
        g(p); 
       } 
       #pragma omp barrier 
      } 
     } 
    } 
} 
void f(particles *p, int id) { 
    for (int i = id * prt_thread; i < (id + 1)*prt_thread; ++i) { 
     x(p[i]); 
    } 
} 

기본적 원하는 작업 같이 판독하는 코드를 갖는다. 각 스레드는 스레드의 id에 따라 p 척을 처리합니다 2) p의 각 요소는 dtnum 번 처리해야합니다. 처리가 임의의 이벤트를 포함 함 3) 50 회 반복마다 하나의 스레드가 다른 작업을 수행해야하며 다른 스레드는 대기해야합니다.

문제점 : gcc는 경고 : 작업 영역 공유, 중요 명령, 정렬 순서 , 마스터 또는 명시 적 작업 영역

어떻게해야합니까?

답변

0

매우 설계도가 좋은 코드는 이해하기 어렵지만 모든 반복 작업을 동기화하는 것이 가장 쉬운 방법이라면 반복적 인 루프를 병렬 omp for 루프에서 꺼내는 것이 가장 쉬운 방법입니다. 그냥 do

const int iterblocks=50; 

#pragma omp parallel shared(p, dtnum) default(none) 
for (int jblock=0; jblock<dtnum/iterblocks; jblock++) { 
    for (int j=0; j<iterblocks; j++) { 
     #pragma omp for nowait 
     for (int i=0; i<prt; i++) 
      x(p[i]); 
    } 
    #pragma omp barrier 
    #pragma omp single 
    g(p); 
    #pragma omp barrier 
} 
0

코드가 잘못되었다고 생각합니다. 당신은 말했다 :

각 요소는 dtnum 번 처리해야합니다.

그러나 p의 각 요소는 maxThreads * dtnum 회 실행됩니다.

코드에서 수행해야 할 작업을보다 명확하게 나타낼 수 있습니까?

+0

스레드 ID가 f로 전달됩니다. id는 배열 p를 같은 크기의 청크로 나눌 때 사용됩니다. f는 무엇과 관련이 없지만 샘플을 추가하겠습니다. – Patrik