gpt4 book ai didi

c++ - OpenMP set_num_threads() 不工作

转载 作者:IT老高 更新时间:2023-10-28 12:52:06 26 4
gpt4 key购买 nike

我正在使用 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 ...
}

关于c++ - OpenMP set_num_threads() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11095309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com