我想知道数据布局Structs of Arrays
( SoA ) 是否总是比Array of Structs
( AoS ) 或Array of Pointers
( AoP ) 快于只适合RAM
编程输入的问题C/JAVA
。
几天前,我正在改进分子动力学算法(用 C 语言)的性能,总结在这个算法中,它是根据粒子的力和位置计算粒子之间的力相互作用。
原始粒子由包含 9 个不同双精度值的结构体表示,3 个表示粒子力 (Fx,Fy,Fz) ,3 个表示位置,3 个表示速度。该算法有一个数组,其中包含指向所有粒子 ( AoP ) 的指针。我决定将布局从AoP更改为SoA以改善缓存使用。
所以,现在我有一个包含 9 个数组的 Struct,其中每个数组存储每个粒子的力、速度和位置 (x,y,z)。每个粒子都通过它自己的数组索引来访问。
我获得了大约1.9x的性能增益(对于仅适合 RAM 的输入),所以我想知道通常从AoP或AoS更改为SoA是否总是会表现更好,如果不是在哪种类型的算法中这样做不会发生。