2013-03-19 102 views
10

我有一個for循環,可以根據條件使用schedule(static)schedule(dynamic, 10)執行。目前,我的代碼是不是DRY(不要重複自己)夠了,以適應以前的功能它具有以下的重複: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 
    } 
} 

閱讀這些線程後,我注意到的OpenMP有#if(expression)編譯:

不過,雖然我看到很多人與我的問題,似乎缺少一個通用的解決方案。最好的解決方案是將for循環的主體轉換爲函數,然後調用函數,但這種解決方案對我來說不夠好。

所以我想知道,OpenMP是否有#if(expression) else類型的編譯? 喜歡的東西:

#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沒有這樣的指令。

我有和你一樣的問題。正如你所提到的,我的解決方案最終使循環體成爲一個函數。否則,你需要使用一個醜陋的宏。

但是,我也嘗試使用schedule(runtime),它讀取環境變量OMP_SCHEDULE。所以,我在運行時改變了這個環境變量,但沒有奏效。這是因爲OpenMP運行時只會在開始時讀取此環境一次。這可能是一個特定於實現的問題。所以,其他實現可能會在運行時讀取這個環境變量。你可以嘗試這種方法。

+0

我假設你正在討論這個建議(http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196)。 Tbh,我認爲即使編譯,OMP_FOR也沒有定義。至於OMP_SCHEDULE去,我不知道它。我會試着環顧四周,看看我能找到什麼,thx! – 2013-03-19 17:43:56