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

Can I conditionally define an openMP parallel region?

我可以写一些像这样的代码:

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

是否有更简洁的方法来执行此操作,从而不必重复 for 循环?

[编辑] - 因此该解决方案适用于预处理级别

#define USE_OPENMP

//...

#ifdef USE_OPENMP
#pragma omp parallel for
#endif
for(int i=0;i<n;i++)

但这并不理想。但是越想越觉得,既然定义并行区域也是预处理,估计不能整齐地做成条件吧?

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

int enabled = 1;

#pragma omp parallel if(enabled)
#pragma omp for nowait
for(int i=0;i<n;i++)

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