2

複数の PBS ジョブ間で異なる乱数を Matlab で作成しようとしています (ジョブ配列を使用しています)。各 Matlab ジョブは、次のような乱数が生成される並列 parfor ループを使用します。

parfor k = 1:10      
  tmp = randi(100, [1 200]);
end

ただし、結果をプロットすると、さまざまなジョブの結果が完全にランダムではないことがわかります。たとえば、結果は乱数の関数であるため、数値がまったく同じであると言って数値化することはできませんが、間違いはありません。それをプロットするとき。プロセスIDおよび/またはクロックを使用して、各ジョブでランダムシードを初期化しようとしました:

rngSeed = feature('getpid'); % OR: rngSeed = RandStream.shuffleSeed;
rng(rngSeed);

しかし、これで問題は解決しませんでした。また、shuffleSeed (時計ベース) を使用する前に、ジョブごとに異なる秒数で一時停止しようとしました。

以上のことから、parfor が何らかの形でランダム シードをいじっていると思いました。parfor のさまざまな反復で異なる乱数を確実に取得する必要がある場合、それは理にかなっています。

私の質問は、それは本当にそうですか、どうすればそれを解決し、さまざまな PBS ジョブ間でランダム性を得ることができますか?

それぞれが 2 つのワーカーで parfor を使用して 4 つのジョブを実行するEDITでは、各ジョブには独自のシード (parfor の外部に設定) がありますが、生成された数値はジョブ間で同一であることを確認しました (parfor の反復間ではなく、Matlab によって処理されます)。 .

EDIT 2 @Sam Roberts が提案したことを試して、次のコードを使用します。

matlabpool open local 2
st = RandStream('mlfg6331_64');
RandStream.setGlobalStream(st);
rng('shuffle');

parfor n = 1:4       
  x=randi(100,[1 10]);
  fprintf('%d ',x(:)');
  fprintf('\n')
end
matlabpool close

しかし、上記のスクリプトへのさまざまな呼び出しで同じ番号を取得します。

4

1 に答える 1

1

並列実行時の正しいランダム性と再現性のために、ランダム サブストリームの使用を検討することをお勧めします。

このRandStreamクラスを使用すると、疑似乱数ストリームを作成できます。このストリームから引き出された数値には、希望するプロパティ (独立性など) があり、シードを制御すると、再現性も得られます。

ただし、たとえば、ストリームから取得される 1 秒ごとまたは 4 回ごとの数値が同じプロパティを持つとは限りません。さらに、 を使用parforすると、ループの反復が実行される順序を制御できなくなります。つまり、再現性が失われます。parforループ内の各ワーカーで異なるサブストリームを使用できます。

一部の RNG、たとえばmlfg6331_64乗法ラグ フィボナッチ ジェネレーター、またはmrg32k3a結合された複数の再帰ジェネレーターは、サブストリームをサポートします。サブストリームとは、同じ RNG によって生成されますが、同じ疑似乱数特性を保持し、個別に選択できる独立したストリームであり、再現性を保持します。さらに、多くの MATLAB および Toolbox 関数にはオプション'UseParallel'and'UseSubstreams'があり、これらの機能を自動的に実行するように指示します。

上記は MATLAB ドキュメンテーション内の技術レベルで文書化されていますが、見つけるのはちょっと難しいです。Statistics Toolbox のドキュメンテーション内に、より説明的なガイドがあります (私に言わせれば、実際には MATLAB に移動する必要があります)。ここでオンラインで読むことができます。

それが役立つことを願っています!

于 2013-06-18T10:08:29.647 に答える