[英]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
。
在程序的連續部分中,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.