私の質問は非常に簡単で、うまくいけばうまくいけばいいです:構築済みのEigen::MatrixXd
行列があるとき、複数のスレッドを使って同じ行列時間がない場合(つまり、行が並行して書き込まれていないことが保証されている場合)、または各スレッドで一時行オブジェクトを作成して、それらを行列にコピーする必要があります。行でEigen :: MatrixXdへのスレッドセーフ書き込み
2
A
答えて
3
Eigen::MatrixXd
はカラムのメジャーストレージであるため、異なるスレッドから同じアドレスに書き込まないという点ではスレッドセーフである可能性がありますが、キャッシュ上に混乱が生じる可能性があります(基本的にはfalse sharingです)。一時的な行のメジャー・マトリックスを作成し、それをコラム・メジャー・マトリックスにコピーする方が速いかもしれません。
また、既存のマトリックスの列を行として扱い(寸法が変更/一致していることを確認してから)、m.transposeInPlace()
を実行することができます。マトリックスの形状と配置によっては、m = m.transpose().eval()
より効率的です。行列が十分に大きいとIDがゼロである場合も
はスレッドのIDを使用することも可能であるベースと例えばOMPとしたり、独自に異なるIDを追跡することなく、std::thread
例えば、類似していない(連続しました)。 これはまた、行数がキャッシュラインサイズの倍数になるように行列をパディングする必要があり、各列は整列したメモリブロックで開始されます。 キャッシュラインが64バイトであると仮定します。整数倍のブロックを扱う場合、各スレッドは「独自の」キャッシュ行にしか触れないので、誤った共有を避けることができます。あなたがこれを行うことができるなら、余分な一時的なものやコピー/スワップはないはずです。
関連する問題
- 1. Luceneインデックスファイルへのスレッドセーフ書き込み
- 2. Eigen MatrixXdはC++でプッシュバック
- 3. ファイル書き込みスレッドセーフC++
- 4. Eigen :: MatrixXd typedefの置換
- 5. PHPでのスレッドセーフなファイル書き込み
- 6. Eigen :: VectorXdをEigen :: VectorXdをEigen :: MatrixXdに変換するlambda関数
- 7. EigenのMatrixXdでFFTを実行するには?
- 8. Pythonの行への書き込み
- 9. Eigen :: MatrixXd to flann :: Matrix <double>変換
- 10. C++ Eigen arrayXXdをMatrixXdに移動
- 11. Sqlalchemyへの書き込み
- 12. ファイルへの書き込み
- 13. エアフローログへの書き込み
- 14. CSVへの書き込み
- 15. ファイルへの書き込み
- 16. アンドロイドエミュレータファイルシステムへの書き込み
- 17. フレームバッファへの書き込み
- 18. Python:ファイルへの書き込みと書き込みエラー
- 19. DataContextへの書き込み
- 20. ファイルへの書き込み
- 21. Wikiへの書き込み
- 22. ハフマンアルゴリズムファイルへの書き込み
- 23. 接続ノードの書き込みノードへの書き込み?
- 24. テキストのファイルへの書き込みと書き込みR
- 25. I2C書き込みプロトコル:レジスタへの書き込み方法?
- 26. Android - オンラインmysqlデータベースへの書き込み/書き込み
- 27. 電子は、USBドライブへの書き込みと書き込み
- 28. ファイルへの書き込みと書き込み
- 29. ファイルへの読み書きの高速読み込みと書き込み
- 30. xlsx書込みcell_valueエラー、新しいワークシートへの書き込み
Eigen :: RowXprをEigen :: MatrixXdで使用するとどうなりますか?キャッシュペナルティは同じですか?私はEigen :: RowXprを回して動作させることができましたが、実際には、一時的なものを作成し、それを直接使用するよりも、はるかに高速ではないようです。 – ibell
"問題"とは、メモリの基本レイアウトと、同じキャッシュライン上の隣接アドレスへの異なるスレッドの書き込みであり、式の記述方法ではありません。より具体的な質問/問題がある場合は、[mcve]を投稿する必要があります。 –