Вы можете попробовать что-то вроде этого
#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;
}