我的问题是,在下面的语句从书的方面:阵列随机结构(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