我可以有条件地定义 openMP 并行区域吗?

DJa*_*mes 4 c openmp

我可以编写一些如下所示的代码:

if (make_parallel)
{
    #pragma omp parallel for
    for (int i=0; i<n; i++)
    {
        //For loop stuff
    }
}
else
{
    //Identical for loop, minus the parallelisation
    for (int i=0; i<n; i++)
    {
        //For loop stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种更简洁的方法可以做到这一点,这样就不必重复 for 循环?

[编辑] - 所以这个解决方案适用于预处理级别

#define USE_OPENMP

//...

#ifdef USE_OPENMP
#pragma omp parallel for
#endif
for(int i=0;i<n;i++)
Run Code Online (Sandbox Code Playgroud)

但这并不理想。但我想得越多,由于定义并行区域也是预处理,因此可能无法以整洁的方式设置条件?

Jér*_*ard 5

您可以简单地使用if这样的子句:

int enabled = 1;

#pragma omp parallel if(enabled)
#pragma omp for nowait
for(int i=0;i<n;i++)
Run Code Online (Sandbox Code Playgroud)

请注意,此条件可以由运行时而不是编译器评估(例如 GCC 就是这样做的)。因此,对于非常小的循环或每次迭代都非常便宜的循环,开销可能明显高于 if-else 解决方案。原因是编译器通常不会将常量传播到 OpenMP 回调计​​算函数,因此代码可能会进行不必要的操作。该解决方案的优点是更干净,有助于编译器生成更小的二进制文件,并且还有助于减少编译时间(因为循环被编译一次)。