2015-05-04 61 views
1

我见过(结构数组)的AOS之间做出比较常见:这个结构叫什么?简单SoA?

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] ???; 

“cache-efficient SoA”? AoSoA? SoAoS? “PITA编码”?一般来说,它似乎是最有效的解决方案,它为SoA型SIMD提供了大量的缓存命中。

+1

我认为增加的缓存效率将被索引数学抵消, 'float x = xyz4 [index/4] .x [index%4]'。 – user3386109

+0

通常我习惯于批量处理需要按顺序执行的情况(在每个线程的给定范围内),所以我认为可以避免在每个条目中进行计算。无论如何,这在理论上看起来非常有效,但我总是发现编码和测试真的很痛苦。 –

回答

3

该数据结构具有多个名称,例如数组的混合结构(参见Extending a C-like Language for Portable SIMD Programming)或数组结构(AoSoA)。

AoS不适用于SIMD。 SoA是一种改进,但在某些情况下仍然不足。该解决方案是一个混合结构的数组。如您所说,它可能是一个PITA,但如果您希望从SIMD获得最高效率(除非收集和分散指令变得高效),那么这就是您必须使用的。

+0

完美 - 我非常喜欢这个名字。我经常使用AoS,只是因为我尝试了备用SoA,但后来开始得到微不足道的改进(我怀疑是由于缓存未命中)。所以我很想尝试这种混合结构。我的一个挑战一直是试图让代码更加实用,特别是因为我正在处理的是要从公共接口访问的数据结构,而不仅仅是高级别的实现细节算法。 –