Fla*_*nix 10 c++ conditional pragma openmp
我有一个可以使用schedule(static)或schedule(dynamic, 10)根据条件执行的for循环.目前,我的代码不是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
}
}
Run Code Online (Sandbox Code Playgroud)
阅读完这些主题之后,我注意到openMP有一个#if(expression)pragma:
但是虽然我看到很多人遇到了我的问题,但似乎缺乏一般的解决方案.最好的解决方案是将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)
Run Code Online (Sandbox Code Playgroud)
或者我被迫将我的for循环体放入一个单独的函数并以这种方式调用它?
这是个有趣的问题。基本上,您希望schedule在运行时更改策略。据我所知,目前的OpenMP还没有这样的指令。
我遇到了与你完全相同的问题。正如您所提到的,我的解决方案最终将循环体作为一个函数。否则,你需要使用一个丑陋的宏。
不过,我也尝试使用schedule(runtime),它读取环境变量OMP_SCHEDULE。所以,我在运行时更改了这个环境变量,但没有起作用。这是因为 OpenMP 运行时一开始只读取该环境一次。这可能是一个特定于实现的问题。因此,其他实现可能会动态读取此环境变量。你可以尝试一下这个方法。