【发布时间】:2015-07-13 09:46:50
【问题描述】:
我已经看到了 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 提供大量缓存命中。
【问题讨论】:
-
我认为增加的缓存效率将被索引数学所抵消,例如
float x = xyz4[index/4].x[index%4]. -
我经常习惯于批量处理需要按顺序完成(每个线程在给定范围内)的情况,所以我认为可以避免按条目进行计算。无论如何,它在理论上似乎很有效,但我总是觉得编写代码和真正测试太痛苦了。