スレッド化された C++ 乱数ジェネレーターを単一のコアで標準の rand() よりも優れたものにするのに問題がありました。(複数のスレッドが rand() を呼び出す問題も見られます)
どこかに並行性の問題があることは知っていますが、それを見ることができません。私は以下に到達し、openmp が利用可能な 8 つのコアに分割されていることを知っています。omp 行をコメントアウトすると、より高速な結果が得られます。助けてください!これは私を夢中にさせています!
時代
Single thread
time ./a.out
real 0m3.497s
user 0m3.492s
sys 0m0.000s
OpemMP 8 cores
g++ -fopenmp randtests.cpp
time ./a.out
real 0m14.723s
user 1m52.275s
sys 0m0.712s
コード:
#include <omp.h>
#include "boost/random.hpp"
#include "boost/generator_iterator.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include "boost/random.hpp"
using namespace std;
class RNG
{
public:
typedef boost::random::mt19937 Engine;
typedef boost::random::uniform_smallint<int> Distribution;
Engine engine;
Distribution distributer;
RNG() : engine(), distributer() {
engine.seed(); }
int operator()() {
return distributer(engine);
}
};
int main(void) {
#pragma omp parallel
{
int i = omp_get_thread_num();
unsigned int myseed = i;
RNG r;
int y;
#pragma omp for ordered schedule(dynamic) nowait
for (unsigned int x = 0; x < 100000000; x++) {
y = r();
}
}
return 0;
}