2013-03-19 101 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