簡體   English   中英

OpenMP set_num_threads()不起作用

[英]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 ++>語言>現在將Open MP支持標志更改為是....

您將獲得所需的結果。

嘗試在omp並行代碼中設置num_threads,它對我有用。 這將輸出為4

#pragma omp parallel
{
   omp_set_num_threads(4);
   int id = omp_get_num_threads();
   #pragma omp for
   for (i = 0:n){foo(A);}
}

printf("Number of threads: %d", id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM