用于 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>>;
我有一个这样的元组
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>>;