37

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

如何控制线程数?

4

4 回答 4

99

除了omp_get_num_threads()在您的情况下在并行区域之外调用之外,调用omp_set_num_threads()仍然不能保证 OpenMP 运行时将使用指定数量的线程。omp_set_num_threads()用于覆盖环境变量的值OMP_NUM_THREADS,它们都控制OpenMP 将为所有并行区域(在 的情况下)或任何后续并行区域(在调用之后)生成的线程组大小的上限. 如果运行时系统认为它更合适,有一种叫做动态团队的东西仍然可以选择较少数量的线程。您可以通过调用或将环境变量设置为来禁用动态团队。OMP_NUM_THREADSomp_set_num_threads()omp_set_dynamic(0)OMP_DYNAMICfalse

要强制执行给定数量的线程,您应该禁用动态团队并使用以下任一方式指定所需的线程数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_threadsOpenMP 子句:

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 ...
}
于 2012-06-19T07:58:03.660 回答
26

omp_get_num_threads()函数返回当前在执行调用它的并行区域的团队中的线程数。您在并行区域之外调用它,这就是它返回的原因1

于 2012-06-19T06:18:04.233 回答
8

根据omp_get_num_threads 的 GCC 手册

在程序的顺序部分中 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 关于禁用动态团队的建议。

于 2015-06-14T00:46:31.917 回答
3

我面临同样的问题。下面给出解决方案

右键单击 Source Program > Properties > Configuration Properties > C/C++ > Language > 现在将 Open MP support flag 更改为 Yes...。

你会得到想要的结果。

于 2016-01-02T17:08:10.027 回答