【问题标题】:Alignment of tuple of arrays for SIMD loadSIMD 加载的数组元组对齐
【发布时间】:2021-04-04 01:28:43
【问题描述】:

我有一个这样的元组

tuple<array<float, 4>, array<float, 4>, array<float, 4>>

现在我想将这些数组加载到 sse 寄存器中

_mm_load_ps(get<0>(tuple).data());
_mm_load_ps(get<1>(tuple).data());
_mm_load_ps(get<2>(tuple).data());

但根据https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE&expand=3330,内在要求内存地址在 16 字节边界上对齐

如何确保数组满足该条件,或者我应该使用未对齐的负载内在

_mm_loadu_ps

也可以将其推广到新的 simd 标准,如 AVX(当然是通过调整数组的大小)?

【问题讨论】:

  • 您是否可以预先分配更多内存,将其与std::align 对齐,然后将其作为std::span&lt;float, 4&gt; 传递?
  • 嗯,可能也可以

标签: c++ simd memory-alignment


【解决方案1】:

你可能会使用alignas 并有类似的东西:

template <typename T, std::size_t N, std::size_t Align>
struct aligned_array
{
    alignas(Align) T data[N];
};

然后

std::tuple<aligned_array<float, 4, 16>,
           aligned_array<float, 4, 16>,
           aligned_array<float, 4, 16>>;

【讨论】:

  • 我可以让aligned_array 继承std::array 并将alignas 放入结构定义中,如struct alignas(16) aligned_array : public std::array
  • 在这种情况下不喜欢继承,但它应该可以工作......
  • 如果没有继承,您的版本根本不能替代std::array。没有operator[] 或标准容器API,自己重新实现所有这些是愚蠢的。对齐的std::array 为@Yamahari 提供了他们想要的东西,但是如果您想避免这种情况,那么根本不使用结构/类并使用原始alignas(16) float arr[4] 作为您的元组成员会更有意义。
猜你喜欢
  • 2016-01-27
  • 2018-01-24
  • 1970-01-01
  • 2016-05-08
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多