用于 SIMD 加载的数组元组对齐

Alignment of tuple of arrays for SIMD load

我有一个这样的元组

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 字节边界上对齐

我怎样才能确保数组满足该条件,或者我应该使用未对齐的加载 instrinsic

_mm_loadu_ps

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

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