我的问题很简单,希望也有一个很好的答案:当我有一个构造的Eigen::MatrixXd矩阵时,我可以使用多个线程同时填充矩阵中的行吗(如果我可以确保没有同时写入任何行),或者我必须在每个线程中创建临时行对象,然后将它们复制(呃......)到矩阵中作为减少操作?
虽然它可能是线程安全的,不会从不同线程写入相同的地址,但由于Eigen::MatrixXd是列主存储,您可能会严重破坏缓存(基本上,这是错误共享)。创建临时行主矩阵然后将其复制到列主矩阵可能会更快。
或者(更好的IMO),您可以将现有矩阵中的列视为行(确保尺寸已切换/匹配),然后执行m.transposeInPlace(). 根据矩阵形状和对齐方式,这可能比 更有效m = m.transpose().eval()。
如果矩阵足够大并且ID是从零开始且连续的(例如使用OMP或类似的,而不是例如不自己跟踪不同的ID),也可以使用线程的ID。std::thread这还需要填充矩阵,以便行数是缓存行大小的倍数,并且每列都从对齐的内存块开始。假设缓存行是 64 字节。如果您处理其整数倍的块,那么您可以避免错误共享,因为每个线程仅触及其“自己的”缓存行。如果你能做到这一点,那么就不应该有额外的临时文件或副本/交换。