我可以编写如下代码:

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

请注意,这个条件可能是evaluated by the runtime,而不是编译器(例如,GCC会这样做).因此,对于非常小的循环或每次迭代都非常便宜的循环,overhead可以显著高于if-else解决方案.原因是编译器通常不会将常量传播到OpenMP回调计算函数,因此代码可能会进行不必要的操作.这种解决方案的好处是更干净,有助于编译器生成更小的二进制文件,也有助于缩短编译时间(因为循环只编译一次).

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

在#include中使用C宏变量

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么GCC可以调用未定义的函数?

ZED for SDL上的C语言服务器

正在try 将文件/文件夹名从目录 struct 存储到链接列表

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

Ruby C Api处理异常

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

tick.q中的Kdb+键控表语法

我在C中运行和调试时得到了不同的输出

如何在VSCode中创建和使用我自己的C库?

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

如何编写postgresql支持函数

在C中交换字符串和数组的通用交换函数

使用 strtok 多次分割一个字符串会导致意外行为

无法将字符串文字分配给 C 中的字符数组

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?

inline 关键字导致 Clion 中的链接器错误