2012-02-28 14 views
1

これはほとんど概念的な問題です。私は乱数ジェネレータをテストして、いくつかのx値(例えば、サイコロロールの場合は6)に渡って一様分布に従うことでその有効性を確認することを考えていました。単純なループでこれをやっているのですが、私はそれを今持っていますが、私はシミュレーションをマルチスレッド化することを考えていました。セマフォと疑似乱数を使用した概念的マルチスレッド

セマフォ保護を持つすべてのスレッド間で共有される乱数ジェネレータを1つしか持たないので、これは私にスピードアップをもたらすだろうと思っていました(2つのスレッドにアクセスせず、同時に乱数を生成する必要があります)。

スレッドごとに他の操作(ほとんどの場合、xをチェックしてインクリメントするステートメントがスレッド化しても)が速い結果を返すことはないため、または乱数ジェネレータに依存すると、本質的に単一糸?

答えて

0

理論的には、少なくともスレッド数が使用中のコア数に達するまでは、パフォーマンスが向上するはずです。ただし、実際には、マルチスレッドインフラストラクチャを処理するためのコード(実行時間)を追加することになります。スレッドの時間の大部分が低速のRNGを待つのに費やされると、パフォーマンスが低下することがあります。

一方、いくつかの賢さでパフォーマンスを向上させることができます。たとえば、乱数の生成専用のタスクが1つあり、1から6までの値を探している場合は、RNGの各結果から複数の値を生成することができます。これらの値をキューに入れ、他のタスクをキューから読み取らせることができます。もちろん、あなたの最適化がRNGの分布を変更しないように注意する必要があります。

実行サイクルをカウントするという考えがあなたを励まらない限り、答えを見つける最も良い方法は試してみることです。そして、プロファイラを使用して、ほとんどの時間が費やされている場所を知ることは常に教育的です。これは、人間が直感だけで直感的に理解するのは難しいことで有名で、経験豊富な開発者でさえも結果に驚かれることがあります。

+0

結果の処理からrngを分離して、素晴らしい提案をしてください。しかし、1 rngを使って複数のロールをシミュレートするにはどうすればいいのか分かりません。私はプロファイラを一度も使用していないし、始める言い訳が必要でした。私はこれを悪いと思っています。 – forTruce

+0

簡単な例:1から6までの数字を生成する場合は、各数字に3ビットしか必要ありません。 RNGで32ビットの値が生成された場合、各値から10ビットの3ビットを取得できます。 –

+0

RNGを別のスレッドで実行するとスピードが向上するとは思っていません。乱数のキューを同期させる際のオーバーヘッドは、どんな利点よりも重要です。 – Gray

5

私はあなた自身の質問に答えたと思います。あなたの計画は、RNGをシングルスレッドで使用するようになります。異なるスレッドは、使用中の単一のスレッドと同じ順番で使用されます。あなたはおそらくスピードアップを達成するでしょうが、負のスピードアップだけを達成します。

+1

「スピードアップを達成する」という意味は、「スピードに影響を与える」ことを意味しますか?スピードアップは私にとって肯定的です。 – Gray

+0

+1、ええ、それはRNG時間とロックオーバーヘッドです - 無意味です。 –

0
同じ時間に2つのスレッドのアクセスを確保しないと で乱数を生成するために必要な

これは、あなたがマルチスレッドの利点を使用していないので、実際には1つのワーカースレッドが実行されることを意味します。あるいは、マルチプルスレッド間でいくつかの作業を配布することについて言及したところが間違っていますか?

複数のスレッドからのRNGアクセスに関する全体的な設計を何とか改善すれば、SemaphoreではなくReaderWriterLockの手法を使用することを検討してください。

+0

私は、あるスレッドがrngにアクセスしてから、対応する値をチェックして、Incをチェックする必要があるため、スピードアップがある程度はあるかもしれないと思います。それが実行されている間、他のスレッドはrngにアクセスしていました。また、readereriterlockと私が好奇心をそそられているので、シード値を更新するためにrngへの次の番号の要求者のアクセスを生成するのに役立つでしょうか?間違いなくここで私のお尻から話す。 – forTruce

+0

私はこのソリューションがRNGの実装に依存していると信じています。あなたは開発のためにどの言語/フレームワークを使用していますか? – sll

+0

現時点では、私はちょうどrngに組み込まれているC#を使用しています。 – forTruce

関連する問題