首页 > 解决方案 > 三个维度的行主存储和列主存储之间的就地转换

问题描述

我有一个程序以行优先(又名“C”)顺序接收三维数据作为平面数组作为输入。

我需要将这些传递给一个库,该库需要以列为主(又名“Fortran”)顺序的相同三维数据。
在我的程序之外预处理数组不是一种选择。

除了性能之外,在复制时转换数据没有问题——每个数组都有几百万个元素,分配和复制是我的主要瓶颈——所以我想就地进行转换,看看是否有帮助.

但是,我一直无法计算出这种转换背后的数学原理,而且我的谷歌搜索也没有什么帮助。
有没有一种有效的方法来就地执行这种转换?

标签: c++arrays

解决方案


就地转换(如果可能)无论如何都会复制这些大数组的所有元素,因此它不会对缓存友好。
对于一个大数组(及其后续的长转换),每个分配都将完成一次,如果您必须处理此类数组的流,您可以重用旧数组以避免分配/释放重复。

我只是建议以可预测/缓存友好的行优先顺序加载数据,并依靠存储缓冲区机制来处理第二个(分配的)数组的列优先存储反模式。


推荐阅读