作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题很简单,希望也有一个很好的答案:当我构造了 Eigen::MatrixXd
矩阵时,我可以使用多个线程同时填充矩阵中的行吗(如果我可以确保没有行被同时写入),或者我必须在每个线程中创建临时行对象,然后将它们作为归约操作复制(呃...)到矩阵中?
最佳答案
虽然就不从不同线程写入相同地址而言它可能是线程安全的,但由于 Eigen::MatrixXd
是列主存储,因此您可能会严重破坏缓存(基本上,这是虚假共享)。创建临时行主矩阵然后将其复制到列主矩阵可能会更快。
或者(在我看来更好),您可以将现有矩阵中的列视为行(确保尺寸已切换/匹配),然后执行 m.transposeInPlace()
。根据矩阵形状和对齐方式,这可能比 m = m.transpose().eval()
更有效。
如果矩阵足够大并且 ID 是从零开始且连续的(例如使用 OMP 或类似的,而不是例如 std::thread
无需自行跟踪不同的 ID)。这还需要填充矩阵,以便行数是缓存行大小的倍数,并且每列都从对齐的内存块开始。假设缓存行是 64 字节。如果您处理其整数倍的 block ,那么您可以避免错误共享,因为每个线程仅触及其“自己的”缓存行。如果您能做到这一点,那么就不应该有额外的临时文件或副本/交换。
关于eigen - 按行线程安全写入 Eigen::MatrixXd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304510/
我是一名优秀的程序员,十分优秀!