OpenMP set_num_threads() is not working
OpenMP set_num_threads() is not working
我正在C++中使用OpenMP编写一个并行程序。
我想使用 omp_set_num_threads()
控制程序中的线程数,但它不起作用。
#include <iostream>
#include <omp.h>
#include "mpi.h"
using namespace std;
int myrank;
int groupsize;
double sum;
double t1,t2;
int n = 10000000;
int main(int argc, char *argv[])
{
MPI_Init( &argc, &argv);
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
MPI_Comm_size(MPI_COMM_WORLD,&groupsize);
omp_set_num_threads(4);
sum = 0;
#pragma omp for reduction(+:sum)
for (int i = 0; i < n; i++)
sum+= i/(n/10);
cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;
MPI_Finalize();
return 0;
}
程序输出:
sum = 4.5e+007
threads=1
如何控制线程数?
并行区域之外调用omp_get_num_threads()
之外,调用omp_set_num_threads()
仍然不能保证 OpenMP 运行时将完全使用指定数量的线程。 omp_set_num_threads()
用于覆盖环境变量的值OMP_NUM_THREADS
它们都控制 OpenMP 将为所有并行区域(在 OMP_NUM_THREADS
的情况下)或任何后续并行区域(在调用 omp_set_num_threads()
之后)生成的线程组大小的上限。有一种称为动态团队的东西,如果运行时系统认为它更合适,它仍然可以选择较少数量的线程。您可以通过调用omp_set_dynamic(0)
或将环境变量OMP_DYNAMIC
设置为 false
来禁用动态团队。
要强制实施给定数量的线程,您应该禁用动态团队并使用任一omp_set_num_threads()
指定所需的线程数:
omp_set_dynamic(0); // Explicitly disable dynamic teams
omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions
#pragma omp parallel ...
{
... 4 threads used here ...
}
或使用 num_threads
OpenMP 子句:
omp_set_dynamic(0); // Explicitly disable dynamic teams
// Spawn 4 threads for this parallel region only
#pragma omp parallel ... num_threads(4)
{
... 4 threads used here ...
}
omp_get_num_threads()
函数返回当前在执行调用它的并行区域的组中的线程数。您在并行区域之外调用它,这就是它返回 1
的原因。
根据 GCC 的omp_get_num_threads手册:
在程序的顺序部分中,omp_get_num_threads返回 1
所以这个:
cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;
应更改为以下内容:
#pragma omp parallel
{
cout<<"sum="<<sum<<endl;
cout<<"threads="<<omp_get_num_threads()<<endl;
}
我使用的代码也遵循了 Hristo 的建议,即禁用动态团队。
我遇到了同样的问题.解决方案如下
右键单击"源程序">"属性">"配置属性"> C/C++> 语言> 现在将"打开 MP 支持标志"更改为"是..."。
你会得到想要的结果。
- Directx 11 - CompileFromFile() is not compiling
- Centos7 g++ "to_string is not in a member of std"
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- reference_wrapper导致"incomplete type is not allowed"
- 结构中的错误"Incomplete type is not allowed"
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- 无法创建 DLL:获取 DLL "is not a valid Win32 application"
- Atom gpp编译器给出"'C:UsersadminUser' is not recognized as an internal or..."错误
- 当我编译XG-Bosst时,出现错误"error: 'Split' is not a member of 'xgboost::common' ……"
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 我的代码应该接受一个数字,并返回字母等级或"Grade is not valid"但 else 语句不起作用
- 如何修复此错误"the value of 'x1' is not usable in a constant expression"?static_assert
- 加载安全区图像"A device attached to the system is not functioning"
- 巴泽尔中的错误"name 'new_local_repository' is not defined"
- 如何修复 SDL2 "GLSL 3.30 is not supported"错误
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- CGAL 绘制函数在 Visual Studio 中给出'CGAL_USE_BASIC_VIEWER is not defined'错误
- "OpenCV Error: The function/feature is not implemented"安卓应用程序