gpt4 book ai didi

eigen - 按行线程安全写入 Eigen::MatrixXd

转载 作者:行者123 更新时间:2023-12-02 09:39:23 30 4
gpt4 key购买 nike

我的问题很简单,希望也有一个很好的答案:当我构造了 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com