【问题标题】:What is this structure called? Simply SoA?这种结构叫什么?简单的 SoA?
【发布时间】: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].
  • 我经常习惯于批量处理需要按顺序完成(每个线程在给定范围内)的情况,所以我认为可以避免按条目进行计算。无论如何,它在理论上似乎很有效,但我总是觉得编写代码和真正测试太痛苦了。

标签: c simd


【解决方案1】:

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

AoS 不适合 SIMD。 SoA 是一种改进,但在某些情况下仍然不够。解决方案是阵列的混合结构。正如你所说,它可能是一个 PITA,但如果你想从 SIMD 中获得最高效率,有时你必须使用它(除非收集和分散指令变得高效)。

【讨论】:

  • 完美——我非常喜欢这个名字。我经常使用 AoS 只是因为我尝试了备用 SoA,但随后开始获得微不足道的改进(我怀疑是由于缓存未命中)。所以我很想尝试这种混合结构。我的挑战之一一直是尝试使代码更实用,特别是因为我正在使用旨在从公共接口访问的数据结构,而不仅仅是高级别的实现细节算法。
猜你喜欢
  • 2013-04-13
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多