2010-09-01 57 views
1

我得到一定值的某些对象,例如: (1)缓存性能VS填充数据

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)它必须?或者我不明白这个概念?

回答

1

不知道你的第一个问题

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

  • 如果真有随机的(= 不可预测的)访问每双 拼成一个缓存行您的数据正确对齐都将 相当于缓存方面。
  • 你的第二个方法是明确 优越。如果 你流访问 数据现代建筑,这是该编译器 /运行/硬件可以很容易地 预测未来的访问,并且有足够的硬件寄存器所有的指针数据
  • 你的第一种方法可能优于 的情况下,你只有几个寄存器, 因为第二编译器 可能需要在三个不同的阵列
  • ,让您的 目前指数的跟踪

因此,在总结它可以取决于许多因素,但趋势是第二种方法将在许多情况下

是优选
0

如果您在只是位置,然后只是速度,或只是加速度做操作,然后(2)是更好的。在其他情况下 - 在大量计算中使用的不仅仅是一种类型 - 那么(1)会更好。

这是假设:

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

不过,说实话,这听起来像过早优化:要做到会的东西,如valgrind,它就能告诉你确切的答案对你的平台来分析的最好的事情。