1. ホーム
  2. c++

[解決済み] OpenMP の set_num_threads() が動作しない

2022-02-01 10:15:22

質問

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 ...
}