我有一個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)
編譯:
- OpenMP: conditional use of #pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- Choose OpenMP pragma according to condition
- Conditional "pragma omp"
- http://openmp.org/mp-documents/ntu-vanderpas.pdf
不過,雖然我看到很多人與我的問題,似乎缺少一個通用的解決方案。最好的解決方案是將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)
還是我不得不把我的循環體成一個單獨的函數,並調用它的方式?
我假設你正在討論這個建議(http://stackoverflow.com/questions/4085595/conditional-pragma-omp/4087196#4087196)。 Tbh,我認爲即使編譯,OMP_FOR也沒有定義。至於OMP_SCHEDULE去,我不知道它。我會試着環顧四周,看看我能找到什麼,thx! – 2013-03-19 17:43:56