2013-05-23 2 views
0

두 개의 중첩 된 for 루프가있는 코드 조각이 있습니다. 첫 번째 단계에는 몇 단계가 있고 두 번째 단계에는 많은 단계가 있고 다른 단계는 주변에 있습니다. 독립적으로 지시문에 대해 omp를 사용하여 루프를 실행할 수 있으며 일관된 결과 (및 속도 향상 속도)를 얻을 수 있습니다. 그러나 내가 좋아하는 것까지 :Openmp 스케줄링

  1. 실행 병렬 첫 번째는 16 단계 이상의 그렇지
  2. 병렬로 두 번째 (그러나 그것은 8 단계를 경우에도 첫 번째)를 실행
  3. 이있는 경우

하나의 루프가 병렬이거나 다른 루프이므로 중첩 된 병렬 처리가 아닙니다. 독립적으로 실행하고 스레드를보기 위해 -H를 실행하면 때로는 단 하나의 스레드 만 관찰하고 때로는 더 많은 스레드를 관찰하여 수행하려는 작업을 이해하고 실제로 성능을 향상시킬 수 있습니까?

지금까지이 같은 짓 : 컴파일되지 않습니다

#pragma omp parallel 
{ 
    #pragma omp for schedule(static,16) 
    for(...){ 
     /* some declarations */ 
     #pragma omp for schedule(static,16) nowait 
     for(...){ 
      /* ... */ 
     } 
    } 
} 

이 (업무 공유 영역 밀접하게 작업 공유의 안에 중첩되지 않을 수, 중요, 주문, 마스터 또는 명시 적 작업 영역) 및 내가 어쨌든 묘사 한 것처럼 행동하지 않을 것이다. 나는 또한 붕괴 시도했지만 "/ * 일부 선언 * /"및 openmp3.0 이후 나는 그것을 피하고 싶습니다 및 대상 하드웨어 컴파일러가 지원할 것입니다 확실하지 않은 문제가있었습니다.

아이디어가 있으십니까?

답변

1

동일한 병렬 영역에 바인드하는 작업 공유 구조를 중첩 할 수는 없지만 중첩 된 병렬 처리를 사용하고 if(condition) 절을 사용하여 영역을 선택적으로 비활성화 할 수 있습니다. 런타임에 conditiontrue으로 평가되면 영역이 활성화되고, 그렇지 않으면 연속적으로 실행됩니다.

/* Make sure nested parallelism is enabled */ 
omp_set_nested(1); 

#pragma omp parallel for schedule(static) if(outer_steps>=16) 
for(...){ 
    /* some declarations */ 
    #pragma omp parallel for if(outer_steps<16) 
    for(...){ 
     /* ... */ 
    } 
} 

여기서 결점은 내부 영역이 런타임에 활성화되지 않으면 작은 오버 헤드가 발생한다는 것입니다. 효율성을 원하고 유지 관리 가능성을 희생 할 준비가되면 outer_steps 값에 따라 중첩 루프와 분기로 두 가지 구현을 작성하여 적합한 분기로 분기 할 수 있습니다.

+0

안녕하세요. 사실 나는 당신이 말한 것처럼 if() {} else {} 내에 두 개의 다른 평행 영역을 작성했습니다. 못생긴하지만 꽤 효율적입니다. 내가 뭔가를 찾고있을 때 당신의 해결책을 시도해 보겠습니다. – Emilien