gpt4 book ai didi

java - 结构数组总是比数组结构快?

转载 作者:行者123 更新时间:2023-12-04 15:58:42 26 4
gpt4 key购买 nike

我想知道数据布局是否 Structs of Arrays ( SoA ) 总是比 Array of Structs 快( AoS ) 或 Array of Pointers ( AoP ) 用于仅适合 RAM 的输入的问题编入 C/JAVA .

几天前,我正在改进分子动力学算法(用 C 语言)的性能,总结在这个算法中,它是根据粒子的力和位置计算粒子之间的力相互作用。

原始粒子由包含 9 个不同 double 值的结构体表示,3 个表示粒子力 (Fx,Fy,Fz) ,3 个表示位置,3 个表示速度。该算法有一个数组,其中包含指向所有粒子的指针 ( AoP )。我决定从 更改布局奥普索阿提高缓存使用率。

所以,现在我有一个包含 9 个数组的 Struct,其中每个数组存储每个粒子的力、速度和位置 (x,y,z)。每个粒子都通过它自己的数组索引来访问。

我获得了大约 的性能提升(对于仅适合 RAM 的输入) 1.9x ,所以我想知道是否通常从 更改奥普服务端 索阿它总是会表现得更好,如果不是在哪些类型的算法中不会发生这种情况。

最佳答案

这将取决于您访问数据的方式。
试着想象一下,当您在 SoA 或 AoS 中访问数据时,硬件中究竟发生了什么。

要推理您的问题,您必须考虑以下事项 -

  • 如果没有缓存,性能应该是相同的,假设所有数据元素的内存访问延迟是相等的。
  • 现在有了缓存,如果你访问连续的地址位置,你肯定会得到性能提升。这在您的情况下完全有效。当你有 AoS 时,这些位置在内存中是不连续的,所以你必须在那里失去一些性能。
  • 您必须在 for 循环中访问您的数据,例如 for(int i=0;i<1000000;i++) Fx[i] = 0 .因此,如果数据量很大,您将很容易看到小的性能优势。如果您的数据很小,这无关紧要。
  • 最后,您也不知道您正在使用的 DRAM。当您访问连续数据时,它将有一些好处。例如要了解为什么会这样,您可以引用 wiki .
  • 关于java - 结构数组总是比数组结构快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13142896/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com