2

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

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

4

2 回答 2

3

只有一种普遍正确的方法:编码、配置文件、测量和比较。

例如:您是否需要实际转置数组?或者将其转置就足够了(在这种情况下,迭代器可以解决问题)。很多时候,当我与我最喜欢的敌人(Fortran)互动时,我不得不“阅读转置”,因为傻瓜是专栏专业的。

使用 Eigen,它可以让您指定存储顺序。

但是 - 再次 - 测试并查看。很可能您正在追求红鲱鱼,而性能上的差异并不值得您花时间使代码复杂化。

于 2013-10-27T02:43:18.573 回答
1

如果我必须选择一个,我会选择读取连续而不是写入连续。原因

  1. 在多处理器系统中,当多个处理器同时对该数据结构进行操作时,在写入期间会出现缓存失效,而在读取期间缓存更有用。因此,在某种程度上,缓存友好读取比写入更有益,因为它也可以跨处理器共享(或在NUMA的情况下)
  2. 许多磁盘在磁盘控制器级别缓冲写入并将写入组合到磁盘以最大化吞吐量,因此那里的一些优化可能会自动帮助写入。

当然,由于这里有许多假设并且取决于您的特定用例和硬件,因此您可能必须自己对其进行分析以查看这些声明的有效性。

于 2013-10-27T02:45:34.273 回答