串行与填充数据的缓存性能

时间:2010-09-01 10:39:53

标签: c caching

我得到了一些具有某些值的对象,例如: (1)

struct massPoint {
    double pos;
    double vel;
    double acc;
} objects[LOTS];

或在数组中相同:

(2)

double pos[LOTS];
double vel[LOTS];
double acc[LOTS];

第一个问题:如果我打电话给(1)填充数据和(2)串行数据,这是对的吗?

第二个问题:如果我做一些只影响vel和acc而没有pos的操作,并且我有很多,那么(2)会更好,因为它在缓存性能方面会更好,因为pos []不必以这种方式缓存,并且(1)它必须?或者我根本没有得到这个概念?

2 个答案:

答案 0 :(得分:1)

不知道你的第一个问题

对于您的第二个问题,没有一般答案,这取决于您的架构和使用模式。

  • 如果你真的有随机(= 不可预测的)访问每个double的 组成一个高速缓存行你的数据都是正确对齐的 相当于缓存。
  • 你的第二种方法很清楚 如果,现代建筑优越 你有流媒体访问权限 数据,即编译器 / runtime / hardware很容易 预测未来访问,并为所有指针提供足够的硬件寄存器数据
  • 你的第一种方法可能更优越 如果您只有很少的寄存器, 因为对于第二个编译器 可能需要跟踪你的 三个不同数组中的当前索引

总而言之,它可能取决于很多因素,但在许多情况下第二种方法更可取的倾向

答案 1 :(得分:0)

如果您正在对 位置进行操作,那么只是速度,或只是加速度,那么(2)更好。

在其他情况下 - 你在大量计算中使用的不仅仅是一种类型 - 那么(1)会更好。

这是假设:

  • 每个集合的总大小太大,无法容纳在本地缓存中(可能)。
  • 您无需进行复杂的计算,无论如何都需要其他外部数据。
  • 您正在执行的操作无法转换为矢量操作。

虽然,老实说,这听起来像是过早优化:最好的办法是用valgrind之类的内容进行分析,这样就可以告诉你平台的确切答案。