OpenMP:在每个线程中都有一个完整的"for"循环
OpenMP: having a complete 'for' loop into each thread
我有这个代码:
#pragma omp parallel
{
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction();
}
#pragma omp single
{
for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction();
}
}
// and so on... up to 5 or 6 of myObject_x
// Then I sum up the buffers and do something with them
float result;
for (int i=0; i<given_number; ++i)
result = myBuffer_1[i] + myBuffer_2[i];
// do something with result
如果我运行此代码,我会得到我期望的,但 CPU 使用率看起来很高。相反,如果我在没有 OpenMP 的情况下正常运行它,我会得到相同的结果,但 CPU 使用率要低得多,尽管在单个线程中运行。
我不想指定线程数,我希望程序根据 CPU 功能选择最大线程数,但我希望每个 for
循环完全在自己的线程中运行。我该怎么做?
此外,我的期望是 myBuffer_1 的 for
循环运行一个线程,另一个for
循环运行另一个线程,其余的在"主"线程中运行。这是对的吗?
-
#pragma omp single
末尾有一个隐式屏障,如果您希望两个single
块同时运行,则需要使用#pragma omp single nowait
。 -
但是,对于您的要求,使用
section
可能是一个更好的主意#pragma omp parallel { #pragma omp sections { #pragma omp section { for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); } #pragma omp section { for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); } } }
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 使用一个 for 循环如何迭代和测试迭代器值?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 为什么有一个指向此代码行(第 7 行)的"no matching call for function"错误?
- 为什么海湾合作委员会声称我违反了"at least one argument for variadic macro",而我至少有一个论点?
- 为什么我必须有一个 boost::mutex for boost::condition_variable
- OpenMP:在每个线程中都有一个完整的"for"循环
- 在C++中,For循环中有一个不递增的变量可以接受吗
- 我的 for 循环出错,无法弄清楚原因,我有一个"expected declaration"错误