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