openMP条件编译指示“if else”

时间:2013-03-19 15:47:07

标签: c++ conditional openmp pragma

我有一个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)编译指示:

但是虽然我看到很多人遇到了我的问题,但似乎缺乏一般解决方案。最好的解决方案是将for循环的主体转换为函数,然后调用函数,但这个解决方案对我来说还不够好。

所以我想知道,OpenMP是否有#if(expression) else种pragma? 类似的东西:

#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循环体放入一个单独的函数并以这种方式调用它?

2 个答案:

答案 0 :(得分:4)

这是一个有趣的问题。基本上,您希望在运行时更改schedule策略。据我所知,目前的OpenMP没有这样的指令。

我遇到了完全相同的问题。正如你所提到的,我的解决方案最终使循环体成为一个函数。否则,你需要使用丑陋的宏。

但是,我也尝试使用schedule(runtime),它读取环境变量OMP_SCHEDULE。所以,我在运行时更改了这个环境变量,但是没有用。这是因为OpenMP运行时只在开始时读取此环境一次。它可能是特定于实现的问题。因此,其他实现可以即时读取此环境变量。你可以尝试这种方法。

答案 1 :(得分:0)

这已经晚了几年,但是对于这种特殊情况,您可以使用运行时库在运行时设置时间表。它在OpenMP 4.5的§3.2.12中定义:

1

您的情况是:

$ ./bin/encrevenodd
enter message: tes
message : 'tes'
encrypt : 'tse'

$ ./bin/encrevenodd
enter message: test
message : 'test'
encrypt : 'tset'

$ ./bin/encrevenodd
enter message: tests
message : 'tests'
encrypt : 'tsset'

$ ./bin/encrevenodd
enter message: my dog has fleas
message : 'my dog has fleas'
encrypt : 'm o a laydghsfes'