.net 4.0で並行するすべての行列要素をsumUpする最も効率的な方法は何ですか?行列の要素をCで並列に集計する最良の方法#
Parallel.Forを使用して内部ループをロックする(objectLock){result + = matrix [i、j]}は2倍の遅さで順次アプローチです。任意のヒントについて
おかげで、 さようなら長さnは、その後、平行メートルアレイを合計m個のアレイに
.net 4.0で並行するすべての行列要素をsumUpする最も効率的な方法は何ですか?行列の要素をCで並列に集計する最良の方法#
Parallel.Forを使用して内部ループをロックする(objectLock){result + = matrix [i、j]}は2倍の遅さで順次アプローチです。任意のヒントについて
おかげで、 さようなら長さnは、その後、平行メートルアレイを合計m個のアレイに
さて、あなたが考えることができますmartrix [M、N]。ところで、ここでlock
を使用しないでください。代わりにInterlocked.Add
を使用してください。私は今忙しいです、私は時間があれば私は例を書いてみましょう。
私のために使用静的変数は、Jロック
複数のスレッドからの非アトミック操作の結果を変更することはできず、正しい結果が期待されます。各スレッドはそれ自身のアキュムレータを必要とし、次に単一のスレッドを使用してすべてのアキュムレータを追加します。 – CodesInChaos
ParallelEnumerable.Sum
を使用しなくても結果は(私はそれが各スレッドにサブセットを合計仮定して、それらの結果を合計)ロックまたはインターロックの操作のいずれかを必要とせずに加算を行う方法を知っています。あなたの行列を仮定
がIEnumerable<IEnumerable<numeric>>
次のとおりです。
var sum = (from row in matrix.AsParallel()
select row.Sum()).Sum();
AsParallel
は、行が並行して処理されることを意味しますが、インナー(列)の合計行が非常に長い場合を除き、(並行処理のオーバーヘッドだけEnumerable.Sum
ますです可能性のあるあらゆる利点を圧倒します)。
答えを編集してください: 'select(row.Sum())。Sum();'行を選択してください.Sum())Sum(); ' –
@Saeed: – Richard
'lock'はコードを効果的にブロックして同期させるので、減速が予想されます。 – SWeko