将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是什么?
What is the fastest way to load the first row of 2x4 64b structure into a 256b register at AVX2?
我有一个结构定义为:
struct HorStruct {
uint64_t v[2][4];
typedef uint64_t value_type;
typedef uint64_t* iterator;
typedef const uint64_t* const_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef uint64_t* pointer;
typedef const uint64_t* const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;};
我想知道如何将它的第一行加载到 AVX2 上的 _m256i 变量中?
使用 _mm256_load_si256
内部函数。引用 Intel Intrinsics Guide:
__m256i _mm256_load_si256 (__m256i const * mem_addr)
#include "immintrin.h"
[...]
Description Load 256-bits of integer data from memory into dst.
mem_addr must be aligned on a 32-byte boundary or a general-protection
exception may be generated.
如果对齐要求有问题,您可以使用未对齐的版本_mm256_loadu_si256
。但是请注意,对齐加载可能会快得多。
我有一个结构定义为:
struct HorStruct {
uint64_t v[2][4];
typedef uint64_t value_type;
typedef uint64_t* iterator;
typedef const uint64_t* const_iterator;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef uint64_t* pointer;
typedef const uint64_t* const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;};
我想知道如何将它的第一行加载到 AVX2 上的 _m256i 变量中?
使用 _mm256_load_si256
内部函数。引用 Intel Intrinsics Guide:
__m256i _mm256_load_si256 (__m256i const * mem_addr)
#include "immintrin.h"
[...] Description Load 256-bits of integer data from memory into dst. mem_addr must be aligned on a 32-byte boundary or a general-protection exception may be generated.
如果对齐要求有问题,您可以使用未对齐的版本_mm256_loadu_si256
。但是请注意,对齐加载可能会快得多。