我有一个 for 循环,可以使用schedule(static)
或schedule(dynamic, 10)
根据条件执行。目前,我的代码不够 DRY(不要重复自己),并且为了适应以前的功能,它具有以下重复:
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:有条件地使用#pragma
- http://msdn.microsoft.com/en-us/library/5187hzke.aspx
- 根据条件选择 OpenMP pragma
- 有条件的“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)
或者我是否被迫将我的 for 循环体放入一个单独的函数中并以这种方式调用它?