2013-03-19 11 views
10

Mam pętlę for, która może być wykonana przy użyciu schedule(static) lub schedule(dynamic, 10) w zależności od warunku. Obecnie Mój kod nie jest suche (dry) i wystarczająco, aby pomieścić poprzednią funkcjonalność Posiada następujące powtórzenia:Pragm acja warunkowa openMP "if 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 
    } 
} 

Po przeczytaniu tych tematów, zauważyłem, że OpenMP ma #if(expression) pragmy:

Ale chociaż widziałem wielu ludzi z moim problemem, nie wydaje się być pozbawiony ogólne rozwiązanie. Najlepszym rozwiązaniem jest przekształcenie ciała pętli for w funkcję, a następnie wywołanie funkcji, ale to rozwiązanie nie jest dla mnie wystarczająco dobre.

Więc zastanawiam się, czy OpenMP ma jakiś rodzaj pragmy z #if(expression) else? Coś jak:

#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) 

Albo jestem zmuszony Place My dla ciała pętli do oddzielnego funkcji i wywołać ją w ten sposób?

Odpowiedz

4

To interesujące pytanie. Zasadniczo, chcesz zmienić zasady schedule w środowisku wykonawczym. O ile mi wiadomo, nie ma takiej dyrektywy dla obecnego OpenMP.

Miałem dokładnie ten sam problem co ty. Moje rozwiązanie zakończyło się uczynieniem z pętli funkcji, jak wspomniałeś. W przeciwnym razie musisz użyć brzydkiego makra.

Jednak próbowałem również użyć schedule(runtime), który odczytuje zmienną środowiskową OMP_SCHEDULE. Więc zmieniłem tę zmienną środowiskową w czasie wykonywania, ale nie działałem. To dlatego, że środowisko wykonawcze OpenMP odczytuje to środowisko tylko raz na samym początku. Może to być problem związany z konkretną implementacją. Tak więc inna implementacja może odczytywać tę zmienną środowiskową w locie. Możesz spróbować tego podejścia.

+0

Zakładam, że mówisz o tej sugestii (http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196). Tbh, nie sądzę, że nawet kompiluje, OMP_FOR nawet nie jest zdefiniowany. Jeśli chodzi o OMP_SCHEDULE, nie miałem o tym pojęcia. Spróbuję rozejrzeć się i zobaczyć, co mogę znaleźć, thx! –