1

無制限のリンクされたブロッキング キューを使用して、消費者と生産者の問題に似たものを実装しました。プロデューサーがオブジェクトをキューに入れ、コンシューマーがそれを受け取ります。同じ量のオブジェクトを処理しながら、試行ごとにスレッドの量を 2 倍にしてプログラムをテストしたところ、すべての試行の時間は一定のようです。それは一定であると思われますか?それともスレッド数が多いということは処理が速くなるということですか? 共有リソースの速度低下または同期の原因が私のコードであるかどうかはわかりません。何か案は?

4

3 に答える 3

3

ボトルネックが何であるかに完全に依存します。

  • コンシューマーがプロデューサーが要素を生成するのと同じ速さで要素を処理している場合、コンシューマーを追加しても役に立ちません。
  • コンシューマーがボトルネックである場合、プロデューサーを追加することは、作業のバックログを構築することを意味します
  • コンシューマがすべて、すでに限界に達している単一のリソース (飽和状態のネットワーク接続やディスクなど) を共有している場合は、スレッドを追加しても役に立ちません。
  • コンシューマが共有リソースで同期し、そのためにコンシューマが大部分の時間連続的に動作するように強制される場合、スレッドを追加しても役に立ちません。
  • コンシューマが CPU バウンドであり、CPU 使用率をすでに最大にするのに十分なスレッドがある場合、スレッドを追加しても役に立ちません。

プログラムの実行中に何が起こっているかを確認する必要があります。

  • 作業キューの長さはどのように見えますか? 成長し続けるだけ?常に0に近い?
  • CPU 使用率はどのように見えますか? ネットワーク/ディスクの使用状況はどうですか?

次に、コードが何を行っているかを分析し、問題がどの程度並列化可能であると予想されるかを調べます

于 2012-10-11T06:14:48.187 に答える
0

おそらくあなたの同期。単一のキューが一度に 1 つのアイテムのみを消費し、消費または生成するときに他のコンシューマーをブロックすると仮定すると、スループットを増やしたい場合は、より多くのキューが必要になります。

于 2012-10-11T06:16:25.267 に答える
0

これは組み合わせであり、最適に近いソリューションを見つけようとする必要があります。シングルコアシステムから始めましょう。そこでは、待機中 (通常は IO の場合) と計算時間のバランスを見つける必要があります。あなたがしていることに応じて、両方を飽和させることができます。たとえば、ディスク速度によって制限されている場合、スレッドを追加しても何も得られません。代わりに、おそらくディスク スケジューリングが台無しになり、パフォーマンスが低下します。一方、IO をまったく待機しない場合、ジョブは反対側にあり、シングル コア プロセッサにスレッドを追加しても何も得られません。

マルチコア システムでは、IO を待機しない限り、スレッドの数を増やしてパフォーマンスを向上させることができます。それ以上のコアは役に立ちません。ただし、IO と同様に、スレッドを追加するとオーバーヘッドが発生するため、高くなりすぎないようにしてください。

于 2012-10-11T06:22:08.070 に答える