按行对 Eigen::MatrixXd 进行线程安全写入



我的问题很简单,希望也有一个很好的答案:当我有一个构造的Eigen::MatrixXd矩阵时,我是否可以使用多个线程同时填充矩阵中的行(如果我能确保没有行同时写入),或者我必须在每个线程中创建临时行对象, 然后将它们复制(呃...)到矩阵中作为归约操作?

虽然在不从不同线程写入同一地址方面可能是线程安全的,但由于Eigen::MatrixXd是列主存储,您可能会对缓存造成严重破坏(基本上,这是错误的共享)。创建临时行主矩阵,然后将其复制到列主矩阵可能会更快。

或者(更好的 IMO),您可以将现有矩阵中的列视为行(确保维度已切换/匹配),然后执行m.transposeInPlace()。根据矩阵的形状和对齐方式,这可能比m = m.transpose().eval()更有效。

如果矩阵足够大并且 ID 从零开始且连续(例如,使用 OMP 或类似,而不是例如std::thread无需自行跟踪不同的 ID)。 这还需要填充矩阵,以便行数是缓存行大小的倍数,并且每列从对齐的内存块开始。 假设缓存行为 64 字节。如果您处理整数倍的块,则可以避免错误共享,因为每个线程仅接触其"自己的"缓存行。如果你能做到这一点,那么不应该有额外的临时或副本/交换。

最新更新