gpt4 book ai didi

c++ - 有什么方法可以强制openmp获得所需的线程数?

转载 作者:行者123 更新时间:2023-12-03 13:16:30 25 4
gpt4 key购买 nike

我正在尝试通过使用子句或在环境中进行设置来设置线程数的各种方法,但是这些方法均无效。有什么方法可以强制OpenMP获得自定义数量的线程?

#include <cmath>
#include <random>
#include <iostream>
#include <chrono>
#include <cfloat>
#include <iomanip>
#include <cstdlib>
#include <omp.h>
#include <trng/yarn2.hpp>
#include <trng/mt19937_64.hpp>
#include <trng/uniform01_dist.hpp>
using namespace std;

double function(double x) {
return cos(x) / landa;
}

int main() {
int rank;
const int N = 1000000;
double sum = 0.0;
omp_set_num_threads(6);
omp_set_dynamic(0);
#pragma omp reduction(+ : sum) //default(none)
{

trng::yarn2 r;

int size = omp_get_num_threads();
cout<<size<<endl;

int rank = omp_get_thread_num();

trng::uniform01_dist<> u;

r.jump(2 * (rank * N / size));

for (long i = rank * N/ size; i < (rank + 1) * N / size; ++i) {
double x= u(r);
x = (-1.0) * log(1.0 - x);
sum = sum+function(x);

}

}

return 0;
}

最佳答案

#pragma omp num_threads(6) reduction(+ : sum)  //default(none) 
{
//OMP_NUM_THREADS=6;
omp_set_num_threads(6);

这是错误的,您需要在 parallel region之前设置线程数。此外,您在此处缺少 parallel子句。因此,您可以执行以下操作:
omp_set_num_threads(6)
#pragma omp parallel reduction(+ : sum)
{
...
}
或者
#pragma omp parallel num_threads(6) reduction(+ : sum)
您不需要两者。
第一种方法(即 omp_set_num_threads)设置所有后续并行区域要使用的线程数,而第二种方法 num_threads显式设置仅用于封闭 parallel region的线程数。
如果仍然无法正常工作,则必须 explicitly disable dynamic teams:
通过添加以下调用:
omp_set_dynamic(0);
#pragma omp parallel ...
{
...
}
source可以读取:

Summary The omp_set_dynamic routine enables or disables dynamicadjustment of the number of threads available for the execution ofsubsequent parallel regions by setting the value of the dyn-var ICV.

关于c++ - 有什么方法可以强制openmp获得所需的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66757982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com