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()は環境変数の値をオーバーライドするために使用され、OpenMPがすべての並列領域(の場合)または結果として生じる並列領域(の呼び出し後)に対して生成するスレッドチームのサイズの上限OMP_NUM_THREADSを制御します。 。ランタイムシステムがより適切であると判断した場合でも、より少ない数のスレッドを選択できる動的チームと呼ばれるものがあります。を呼び出すか、環境変数をに設定することにより、動的チームを無効にできます。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 に答える