SIMD 加载的数组元组对齐

问题描述

我有一个这样的元组

tuple<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(当然是通过调整数组的大小)?

解决方法

您可能会使用 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,16>>;