gpt4 book ai didi

c++ - openMP 条件编译指示 "if else"

转载 作者:可可西里 更新时间:2023-11-01 16:18:12 36 4
gpt4 key购买 nike

我有一个 for 循环,可以根据条件使用 schedule(static)schedule(dynamic, 10) 执行。目前,我的代码还不够干(不要重复自己),为了适应以前的功能,它有以下重复:

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) 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)

或者我是否被迫将我的 for 循环主体放入一个单独的函数中并以这种方式调用它?

最佳答案

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

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

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

关于c++ - openMP 条件编译指示 "if else",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15504080/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com