我可以有条件地定义 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 回调计算函数,因此代码可能会进行不必要的操作。这个解决方案的好处是更干净,帮助编译器生成更小的二进制文件,还有助于减少编译时间(因为循环编译一次)。
我可以写一些像这样的代码:
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 回调计算函数,因此代码可能会进行不必要的操作。这个解决方案的好处是更干净,帮助编译器生成更小的二进制文件,还有助于减少编译时间(因为循环编译一次)。