行主存储和列主存储在三个维度上的就地转换

时间:2019-07-01 10:16:58

标签: c++ arrays

我有一个程序,以行主(也称为“ C”)的顺序接收三维数据作为平面数组作为输入。

我需要将这些传递给需要相同的三维数据的库,这些数据应按列大(也称为“ Fortran”)顺序进行。
不能在程序外部预处理数组。

复制时在数据上进行转换除性能外没有问题-每个数组都有数百万个元素的相当多的数组,而分配和复制是我的主要瓶颈-所以我想就地进行转换并看看如果有帮助。

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

1 个答案:

答案 0 :(得分:1)

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

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