Parallel Patternsを読んでいるときに、この記事へのリンクを見つけました
しかし、私は今少し混乱しています。
Parallel.For のすべての反復が結果を生成し、それを配列の項目として格納するとどうなるでしょうか。競合状態はなく、同期も必要ありません。ただし、キャッシュ ラインはすべてのスレッドと同期する必要があり、パフォーマンスが低下します。(私が間違っていなければ)。
だから、パフォーマンスを改善する方法が存在するかどうかに興味があります。
Parallel Patternsを読んでいるときに、この記事へのリンクを見つけました
しかし、私は今少し混乱しています。
Parallel.For のすべての反復が結果を生成し、それを配列の項目として格納するとどうなるでしょうか。競合状態はなく、同期も必要ありません。ただし、キャッシュ ラインはすべてのスレッドと同期する必要があり、パフォーマンスが低下します。(私が間違っていなければ)。
だから、パフォーマンスを改善する方法が存在するかどうかに興味があります。
Parallel.For のすべての反復が結果を生成し、それを配列の項目として格納するとどうなるでしょうか。
偽の共有が発生するためには、互いに近い配列項目にアクセスするために異なるスレッドが必要になります。
実際には、少数のスレッド (C と呼びましょう) がサイズ N の大きな配列 (N >> C) を処理しています。これは、各スレッドがかなり多くの項目を処理することを意味します。それらが独立して処理できると仮定すると、それを行う理想的な方法は、連続した分割を行うことです。したがって、各スレッドは配列内の連続した位置を取得します。これにより、誤った共有がかなりうまく回避されます。
たとえば、インターリーブされた配列要素を処理するのは意味がありません。実際に偽共有が発生するからです。ただし、負荷分散が機能する場合があるため、連続戦略を常に使用できるとは限りません。この場合、どちらがより有害かを確認する必要があります: 時折発生する偽の共有と不適切な負荷分散です。議論は長い。基礎となる TPL スケジューラーは、最適なトレードオフを得るのに十分に設計されていると確信しています。