我的問題是,在下面的語句從書的方面:陣列隨機結構(AOS)與數組(SOA)結構的量化
不幸的是,SOA的形式,並不是在所有的理想情況。對於 隨機或不連貫的情況,收集用於訪問數據,SoA表單可能會導致額外的不需要的數據被讀取到緩存中,從而降低性能。在這種情況下,使用AoS 表單代替將導致較小的工作集和提高的性能。但是,通常情況下,如果計算結果爲向量化的 ,則首選SoA表單。
爲什麼會導致更好的性能AOS我猜測是不同的時,或更好的全部,在相同的結構域都參與了單矢量運行。
實施例(只是一個概念,沒有具體的,或者工作的代碼在所有):
/*Note that the types of data I maintain the same intentionally,
to simplify discussion*/
struct Data {
float mean;
float distribution[10]
}
和定義這些的陣列得到隨機從一些數據源
Data aos[5];
現在,如果在向量化循環期間我做類似的事情:
float* dataPtr = &(aos[0].mean);
#pragma simd
for(int i=0; i< 60; i++)
{
const float mean = (*dataPtr);
/*do something with mean */
dataPtr++;
/*do something with distribution */
}
這將導致更好的性能,在SoA的情況下,我會在緩存行上推送更多信息,以便在計算過程中實際需要。一些CPU預緩存?在AoS的情況下,取而代之的是更好的性能。
我的假設是正確的還是還有別的?
可怕的三字母首字母縮略詞:SoA =陣列結構,AoS =結構陣列。 – 2015-02-23 14:59:31
@HansPassant:他們就是這樣稱呼的,寫下完整的名字會讓標題太長而且不難看。 – Tigran 2015-02-23 15:01:51
@Tigran:爲了那些不瞭解你的書的術語的人的利益,定義一次術語並不需要很長時間。 – 2015-02-23 15:05:24