我见过AoS(结构阵列)之间的常见比较:
struct xyz
{
ALIGNED float x, y, z, ignored;
};
ALIGNED struct xyz AoS[n];
和SoA(阵列结构):
struct SoA
{
ALIGNED_AND_PADDED float x[n];
ALIGNED_AND_PADDED float y[n];
ALIGNED_AND_PADDED float z[n];
};
那么这种数据表示会被称为什么?
struct xyz4
{
ALIGNED float x[4];
ALIGNED float y[4];
ALIGNED float z[4];
};
ALIGNED struct xyz4[n/4] ???;
“缓存效率高的SoA”? AoSoA?一个SoAoS?一个“PITA代码”?一般来说,这似乎是最有效的解决方案,为SoA类型的SIMD提供了大量的缓存命中率。
答案 0 :(得分:3)
该数据结构有多个名称,例如阵列的混合结构(参见Extending a C-like Language for Portable SIMD Programming)或数组结构数组(AoSoA)。
AoS不适合SIMD。 SoA是一种改进,但在某些情况下仍然不够。解决方案是阵列的混合结构。它可能就像你说的那样,但如果你想从SIMD中获得最高效率,那么你必须使用它(除非收集和分散指令变得有效)。