我可以计算多线程数的平均值吗?
Can i calculate the average of multi-thread numbers?
我在C++中使用多线程函数。使用n
多线程,我有n
随机输出。我需要计算代码中多线程输出的平均值。假设对于n=4
线程,代码是
#include <omp.h>
#include <unistd.h>
#include <stdio.h>
#include <random>
#include <iostream>
#include <cmath>
#include <iomanip>
#include <array>
#include <eigen3/Eigen/Dense>
#define W 1.0
#define avg_disorder 10
#define numThd 4
int main()
{
#pragma omp parallel num_threads(numThd)
{
// define random numbers
std::mt19937 rng;
std::uniform_real_distribution <> dist;
std::random_device r;
std::array<int,624> seed_data;
std::generate(seed_data.begin(), seed_data.end(), std::ref(r));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
rng.seed(seq);
Eigen::Array<double, -1, 1> rp; // rp= random potential
rp = Eigen::Array<double, -1, 1>::Zero(avg_disorder, 1);
//List of 10 random numbers
for(int avr = 0; avr < avg_disorder; avr++ )
{
rp(avr,0) = 0.5* W* (-1 + 2* dist(rng) );
}
// output: the mean of the rp
#pragma omp critical
{
FILE *output;
char name[50];
sprintf(name, "avgW%06.2f.dat", W);
output = fopen(name, "a");
fprintf(output, "%e n", rp.mean() );
fclose(output);
}
}
return 1;
}
// run the file avgThreads
//g++ -std=c++0x -fopenmp -o avgThreads avgThreads.cpp
输出:4 个线程:4 个结果(rp 的 4 个不同平均值(。
1.015983e-01
4.097469e-02
-1.275186e-01
-1.243190e-01
我的问题是:
我可以计算代码中多线程输出的平均值吗?
你可以试试这样的东西
#include <omp.h>
#include <stdio.h>
#include <random>
#include <iostream>
#include <cmath>
#include <iomanip>
#include <array>
#include <Eigen/Dense>
#define W 1.0
#define avg_disorder 10
#define numThd 4
int main()
{
double average = 0.0;
#pragma omp parallel num_threads(numThd) reduction(+ : average)
{
// define random numbers
std::mt19937 rng;
std::uniform_real_distribution <> dist;
std::random_device r;
std::array<int, 624> seed_data;
std::generate(seed_data.begin(), seed_data.end(), std::ref(r));
std::seed_seq seq(std::begin(seed_data), std::end(seed_data));
rng.seed(seq);
Eigen::Array<double, -1, 1> rp; // rp= random potential
rp = Eigen::Array<double, -1, 1>::Zero(avg_disorder, 1);
//List of 10 random numbers
for (int avr = 0; avr < avg_disorder; avr++)
{
rp(avr, 0) = 0.5* W* (-1 + 2 * dist(rng));
}
average += rp.mean();
// output: the mean of the rp
#pragma omp critical
{
cout << rp.mean() << endl;
//FILE *output;
//char name[50];
//sprintf(name, "avgW%06.2f.dat", W);
//output = fopen(name, "a");
//fprintf(output, "%e n", rp.mean());
//fclose(output);
}
}
cout << average / (double) numThd << endl;
return 1;
}
它使用 omp 缩减。
对于通用用途(假设您不知道使用的线程数(,您可以执行
double operation();
double averaged_operation()
{
double average = 0.0, count_threads=0.0;
#pragma omp parallel reduction(+ : average, count_threads)
{
average += operation();
count_threads += 1.0;
}
return average / count_threads;
}
相关文章:
- 计算平均值,不包括上次得分
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二叉搜索树C++中计算平均值
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 我可以计算多线程数的平均值吗?
- 计算另一个图像像素满足条件的像素值的平均值
- 如何计算和显示C++中5个数字的平均值?
- 计算平均值:蒙版图像与投资回报率的不同结果
- 类型检测:使用variadic参数正确实现计算平均值的函数
- C 平均程序在循环时不计算n后不计算平均值
- C++ - 计算"for"函数中的平均值
- 计算用于CAFFE分类的HDF5数据集的平均值
- 如何使用多尺寸阵列计算C 中每个学生的平均值
- 如何计算结构阵列内的平均值
- 我需要以尺寸方式计算数组的平均值
- 我必须将 5 个数字放入一个数组中,而不是 cin 计算平均值并输出它,我做错了
- 我需要知道如何正确计算平均值和偏差
- 计算数组中特定线的平均值并存储在另一个数组中
- 如何使用不同的功能计算三个数字的总和,平均值和产物
- 浮点数组的中间模式平均值计算