我可以编写一些如下所示的代码:
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)
但这并不理想。但我想得越多,由于定义并行区域也是预处理,因此可能无法以整洁的方式设置条件?
您可以简单地使用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 回调计算函数,因此代码可能会进行不必要的操作。该解决方案的优点是更干净,有助于编译器生成更小的二进制文件,并且还有助于减少编译时间(因为循环被编译一次)。
| 归档时间: |
|
| 查看次数: |
241 次 |
| 最近记录: |