如何在转置数组时有效地使用缓存?

时间:2013-10-27 02:29:06

标签: c++ caching

如果我有一个表示MxN矩阵内容的一维数组(其中最低有效维在内存中是连续的),我如何在转置它时最好地利用缓存(以放置最重要的内容)连续记忆中的维度)。这个问题可以改写如下;

如果我可以选择读取连续内存但是写入随机访问位置或从随机访问位置读取并写入连续内存,所有条件都相同,我应该选择哪个?

2 个答案:

答案 0 :(得分:3)

只有一种通常正确的方法:代码,配置文件,度量和比较。

例如:您是否需要实际转置数组?或者它是否足以将其转换为读取(在这种情况下,迭代器将完成这一操作)。通常当我与我最喜欢的敌人(Fortran)互动时,我必须“阅读转置”,因为傻瓜是专栏。

与Eigen一起玩,可让您指定存储顺序。

但是---再次 - 测试并看到。我们可能会认为你正在追求一个红鲱鱼,而且性能上的差异不会让你的代码复杂化。

答案 1 :(得分:1)

如果我必须选择一个,我会选择连续写入连续写入。原因

  1. 在多处理器系统中,当多个处理器同时在此数据结构上运行时,写入期间将有cache invalidation,而缓存在读取期间更有用。因此,缓存友好读取在某种程度上比写入更有益,因为它也可以在处理器之间共享(或者在NUMA的情况下)
  2. 许多磁盘缓冲磁盘控制器级别的写入并将写入组合到磁盘以最大化吞吐量,因此某些优化可能会自动帮助写入。
  3. 当然,由于此处有许多假设,并且取决于您的具体用例和硬件,因此您可能需要自行对其进行分析,以了解这些声明的有效性。