2010-09-01 75 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,它就能告訴你確切的答案對你的平臺來分析的最好的事情。