C++ 11で新しい乱数ジェネレータを使用しています。さまざまな意見がありますが、このthreadから大多数がスレッドセーフではないと思われます。結果として、各スレッドが独自のRNGを使用するプログラムを作りたいと思います。私はこのプログラムのマルチスレッドとシングルスレッドのバージョンを実行して、時間を追跡するとき、彼らは、各スレッドがC++で独自のRNGを使用する方法11
#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"
using namespace std;
int main()
{
unsigned long long app = 0;
{
//mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
mt19937_64 engine; //USE FOR SINGLE THREAD
uniform_real_distribution<double> zeroToOne(0.0, 1.0);
//#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
for (unsigned long long i = 0; i < 2000000000; i++)
{
if(zeroToOne(engine) < 0.5) app++;
}
}
cout << app << endl;
return 0;
}
:
例は、OpenMPのでこれを実現する方法の関連する説明に記載されています実行後に同じ時間をかけて終了します。また、app
は2つのケースでは同じサイズではありませんが、異なるシードが原因であると考えられます。
質問:提供されている例では、各スレッドが独自のRNGを使用するように強制する方法を正しく示していますか?そうでない場合は、これがどのように行われたかの例を見ることができますか、またはこれを達成する方法を説明する場所への参照を取得できますか?
のようないくつかの実証済みのソリューションを示唆している非常に有用である、この例をありがとうございました。私には2つの質問があります:(1)あなたは ':engines()'をなぜ組み込むのを選んだのですか?厳密に言えば、それは必要ですか? ....(2)並列化されていない私のプログラムの後のループで 'rand'オブジェクトを使用することを許可しましたか? – BillyJean
@BillyJean(1)少なくとも1つが呼び出された場合、イニシャライザリストの各要素ctorを呼び出す必要はありませんが、個人的なスタイルです。 (2)100%ではないが、 'omp_get_thread_num()'は並列化されていない領域に対して0を返すと思います。 – hansmaad
最終的な質問:私は 'RNG'をグローバルに、オブジェクトを' rand'グローバルにもします。条件付き '(rand()<0.5)ではなく、' rand 'に依存する計算を行うグローバル関数 'func'を呼び出します。 'func'の' rand'の使用はまだスレッドセーフであろうか?私は「はい」と言いますが、あなたの専門家の意見も聞きたいと思います。 – BillyJean