1

私のコードでは、モンテカルロ シミュレーションを実行する 2/4 スレッドがあります。それぞれが多数の実験を実行し、すべての結果を stl ベクトルに収集します。私の質問は次のとおりです。各スレッドが 1000 の実験を順番に実行するとします。結果を一度に 1 つずつ共有ベクトルに保存するのと、時々保存するのとではどちらがよいでしょうか? 一貫した量のデータが得られるまで待つと、ベクターへの書き込みに時間がかかるため、2 番目のソリューションが必ずしも最初のソリューションよりも優れているかどうかはわかりません。

PS 各実験は数値計算であるため、IO 操作はありません。

ありがとう

4

3 に答える 3

8

結果のいずれかを使用する前に、すべての結果が計算されるまで待機する場合は、ベクトル内に 4,000 個の結果用のスペースを事前に割り当て、各スレッドがベクトル内の要素の 1 つの範囲に書き込むようにします。2 つのスレッドがベクトル内の同じ要素にアクセスすることはないため、ロックは必要ありません。

計算された結果を使用したい場合は、ベクトルの代わりにある種の並行キュー データ構造を使用します。

于 2011-01-19T05:05:53.530 に答える
2

ベクトルに 2000 ~ 4000 個の要素しか入れていない場合、どちらの方法でも大きな違いがあるとは思えません。

アルゴリズムにとって最も自然なことは何でもします。それが十分に機能しない場合は、別の方法を検討してください。

少し考えた後、各スレッドが結果をローカル ベクトルに格納し、ローカル ベクトルの内容を「グローバル」ベクトル (ロックによって保護されている) にコピーすることは、両方の目的 (単純さと速度) に役立つ可能性があります。スレッドが完了しました。もちろん、結果を待っているものは、更新を取得する前にスレッドが完全に終了するまで待機できる限りです。

于 2011-01-19T05:06:51.107 に答える
0

ここでは、ベクトルよりも単方向リストの方が適している場合があります。

読み取りスレッドが 1 つ、FIFO への書き込みスレッドが 1 つしかない場合は、同期は必要ありません。秘訣は、少なくとも 1 つの「ダミー」要素を常にリストに保持することです。また、 head == tail の場合、 fifo は空です。同期の必要がないように、ヘッド ポインターとテール ポインターはプッシュとポップで操作できます。

これを使用すると、複数の Q を作成できます。同期は必要ありません。新規作成/削除に時間がかかる場合は、再利用可能な要素を保持する Q を作成できます。

幸運を祈ります。

覚えておいてください..正確に1人のリーダー、および正確に1人のライター..それ以上でもそれ以下でもありません。秘訣は、このようなQをたくさん作成することです.Qはオブジェクトをリサイクルします..そして、スレッド同期のものは必要ありません...

Q が空で実行される場合は、sleep() / wakeup() 機能が必要です。

そして、私がまだ言っていない場合に備えて.. 正確に1人の読者と正確に1人の作家。

于 2011-01-19T05:41:39.653 に答える