我想知道对于在C/JAVA编写的只适合存储在RAM中的输入问题,数据布局“结构体数组”(SoA)是否总是比“结构体数组”(AoS)或“指针数组”(AoP)更快。
几天前,我正在改进分子动力学算法(使用C语言),简单来说,该算法基于粒子的力和位置计算粒子之间的相互作用力。
原始粒子由一个包含9个不同双精度浮点数的结构体表示,其中3个用于粒子力(Fx,Fy,Fz),3个用于位置,3个用于速度。该算法具有包含所有粒子指针的数组(AoP)。我决定将布局从AoP更改为SoA以提高缓存利用率。
因此,现在我有一个包含9个数组的结构体,每个数组都存储每个粒子的力量、速度和位置(x,y,z)。每个粒子通过其自己的数组索引访问。
我在性能方面获得了约1.9倍的提升(对于只适合存储在RAM中的输入),因此我想知道通常情况下,从AoP或AoS转换为SoA是否总是表现更好,如果不是,在哪些类型的算法中不会发生这种情况。
几天前,我正在改进分子动力学算法(使用C语言),简单来说,该算法基于粒子的力和位置计算粒子之间的相互作用力。
原始粒子由一个包含9个不同双精度浮点数的结构体表示,其中3个用于粒子力(Fx,Fy,Fz),3个用于位置,3个用于速度。该算法具有包含所有粒子指针的数组(AoP)。我决定将布局从AoP更改为SoA以提高缓存利用率。
因此,现在我有一个包含9个数组的结构体,每个数组都存储每个粒子的力量、速度和位置(x,y,z)。每个粒子通过其自己的数组索引访问。
我在性能方面获得了约1.9倍的提升(对于只适合存储在RAM中的输入),因此我想知道通常情况下,从AoP或AoS转换为SoA是否总是表现更好,如果不是,在哪些类型的算法中不会发生这种情况。