2013-03-15 3 views
0

OpenMP를 사용하여 병렬 처리 한 outer for 루프가 있습니다. 그러나이 for 루프에는 병렬로 실행될 수있는 코드 섹션이 있습니다.omp 병렬 섹션 내에서 openmp 병렬 섹션?

OpenMP 섹션 절을 사용하여 병렬 처리 할 수 ​​있습니까? 이것은 가능한가? for 루프의 각 반복은 단 하나의 스레드에 의해 실행되므로 각 반복 내에서 병렬로 여러 스레드에서 실행되는 코드 섹션을 요청할 수 있습니까? 나머지 코드는 하나의 스레드, 즉 해당 루프 반복이 할당 된 스레드에 의해 실행되어야합니다.

예 :

omp_p = omp_get_max_threads(); 
omp_set_nested(1); 
#pragma omp parallel for num_threads(omp_p/2) 
for(int p=0;p<omp_p/2;p++){ 
    size_t a = (p*N)/(omp_p/2); 
    size_t b = ((p+1)*N)/(omp_p/2); 
    for(int i=a;i<b;i++){ 
     /*Work on A[a]->A[b]*/ 
     for(int j=0;j<n;j++){ 
     for(int k=0;k<N;k++){ 
      /*Serial code*/ 
      #pragma omp parallel sections 
       { 
       #pragma omp section 
        { 

        } 
       #pragma omp section 
        { 

        } 

       } 
      /*Serial work*/ 
      #pragma omp parallel sections 
       { 
       #pragma omp section 
        { 

        } 
       #pragma omp section 
        { 

        } 
       } 
      /*Serial code*/ 
     } 
     } 
    } 
} 

이것은 내가 모든 병렬 부분을 사용하지 않은 경우보다 훨씬 느리게 갈 수있는 프로그램을 일으키는 ..

+0

중첩 된 병렬 처리로 인한 엄청난 오버 헤드 외에도 'i','j' 및'k' 루프 카운터는 기본 공유 클래스 인'shared'를 가져 오며 명시 적으로'private'로 선언되어야합니다. –

+0

아, 죄송합니다. for() 중괄호 안에 int로 선언하는 것을 잊었습니다. 이걸 수정했습니다 .. – user1715122

+0

단순히 모든 스레드 사이에서 루프를 분해하고 내부 루프의 모든 것을 직렬로 실행하지 못하게하는 이유는 무엇입니까? 'N'은 쓰레드의 수에 비해 너무 적습니까? –

답변

1

중첩 된 OMP가 가능해야한다 : 나는 다음과 같은 코드 조각이있다. 그러나 다음과 같은 이유로 인해 성능 향상을 볼 수 없을 수도 있습니다.

  1. 중첩 된 OMP로 인해 CPU 코어 수보다 많은 스레드가 생성 될 수 있습니다. 이것은 많은 컨텍스트 스위칭을 수행 할 수 있습니다.
  2. OMP 병렬 섹션은 4 개의 중첩 된 루프 내부에 있으므로 스레드 생성 및 제거로 인해 오버 헤드가 발생할 수 있습니다.
+0

OP가 명시 적으로 외부 병렬 영역에 구성된 스레드 수의 절반을 실행하도록 명령하고 각'sections' 구문에 단 두 개의 섹션 만 있으면 첫 번째 점이 유효하지 않습니다. –

+0

@HristoIliev 섹션의 수와 num_threads()를 설정하지 않으면 생성 된 omp 쓰레드의 수는 섹션의 수와 같을까요? 예, 미안하지만 그것에 대해 몰랐습니다. – veda

+0

죄송합니다, 분명히 당신의 본문에 모달을 잘못 읽었습니다. 구현에 따라 2 개의 섹션이 결합 된 영역에 몇 개의 스레드가 사용됩니까? –