2013-03-19 6 views
10

조건에 따라 schedule(static) 또는 schedule(dynamic, 10)을 사용하여 실행할 수있는 for 루프가 있습니다. 현재 내 코드 (자신을 반복하지 마십시오) 충분하고 다음 반복이 이전 기능 수용 할 DRY되지 않습니다 :이 스레드를 읽은 후openMP 조건부 pragma "else else"

boolean isDynamic; //can be true or false 
if(isDynamic){ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(dynamic, 10) 
    for(...){ 
     //for code inside 
    } 
}else{ 
    #pragma omp parallel for num_threads(thread_count) default(shared) private(...) schedule(static) 
    for(...){ 
     //SAME for code inside, in fact, this is the EXACT same for as before 
    } 
} 

을, 나는 OpenMP를이 #if(expression) 프라그를 가지고 나타났습니다 :

는하지만, 일반적인 솔루션을 부족한 것 같습니다. 가장 좋은 해결책은 for 루프의 본문을 함수로 변환 한 다음 함수를 호출하는 것입니다. 그러나이 솔루션은 나에게 충분하지 않습니다.

OpenMP에는 #if(expression) else 종류의 pragma가 있습니까?

#if(isDynamic)pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(dynamic, 10) 
else 
pragma omp parallel for num_threads(thread_count) default(shared) 
private(...) schedule(static) 

을 아니면 별도의 함수로 루프 본문 내를 배치하고 그런 식으로 전화를 강제 이니 뭔가처럼?

답변

4

이것은 흥미로운 질문입니다. 기본적으로 런타임에 schedule 정책을 변경하려고합니다. 내가 아는 한, 현재 OpenMP에는 해당 지시문이 없습니다.

나는 똑같은 문제를 겪었습니다. 내 솔루션은 당신이 언급 한 것처럼 함수로 루프 본문을 만드는 끝났다. 그렇지 않으면 추한 매크로를 사용해야합니다.

그러나 환경 변수 OMP_SCHEDULE을 읽는 schedule(runtime)도 사용하려고했습니다. 그래서 런타임에이 환경 변수를 변경했지만 작동하지 않았습니다. OpenMP 런타임은 처음에는이 환경을 한 번만 읽었 기 때문입니다. 구현 관련 문제 일 수 있습니다. 따라서 다른 구현은이 환경 변수를 즉시 읽을 수 있습니다. 이 방법을 시도해보십시오.

+0

나는이 제안에 대해 이야기하고 있다고 가정합니다 (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, 나는 컴파일하는 것조차 생각하지 않는다. OMP_FOR도 정의되지 않았다. OMP_SCHEDULE이가는 한 그것에 대해서는 전혀 몰랐습니다. 나는 주변을 둘러보고 내가 찾을 수있는 것을 보게 될 것이다. –