将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是啥?

Posted

技术标签:

【中文标题】将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是啥?【英文标题】:What is the fastest way to load the first row of 2x4 64b structure into a 256b register at AVX2?将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是什么? 【发布时间】:2015-07-02 15:12:55 【问题描述】:

我有一个结构定义为:

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 变量中?

【问题讨论】:

【参考方案1】:

使用 _mm256_load_si256 内在函数。引用Intel Intrinsics Guide:

__m256i _mm256_load_si256 (__m256i const * mem_addr)

#include "immintrin.h"

[...] 说明 将 256 位整数数据从内存加载到 dst。 mem_addr 必须在 32 字节边界或通用保护上对齐 可能会产生异常。

如果对齐要求有问题,您可以使用未对齐版本_mm256_loadu_si256。但请注意,对齐的加载可能会明显更快。

【讨论】:

我可以像这样使用它:_m256i loc = _mm256_load_si256 (Horstruct.v[0]) 吗? @user1979163 您可能需要转换指针才能编译:__m256i loc = _mm256_load_si256(reinterpret_cast&lt;__m256i const*&gt;(hs.v)); 在最近的 Intel HW 上,如果地址 对齐,movdqu 将具有与 movdqa 相同的延迟。此外,只要加载不拆分缓存行(或更糟的是,页面边界),未对齐加载几乎不会受到惩罚。 @ComicSansMS 感谢您的回答。你对做反向操作有什么建议吗? 2x 256b 寄存器到 2x4 64b 结构? @YigitDemirag 只需确保指针指向正确的位置,然后为存储进行强制转换以使编译器满意。喜欢uint64_t v[2][4]; __m256 r1, r2; _mm256_store_si256(reinterpret_cast&lt;__m256i*&gt;(v[0]), r1); _mm256_store_si256(reinterpret_cast&lt;__m256i*&gt;(v[1]), r2);

以上是关于将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器

从填充为 0 的数组加载到 256 位 AVX2 寄存器

在啥情况下,AVX2 收集指令会比单独加载数据更快?

使用 AVX2 C++ 的选择性加载

Numpy - 将具有第一行的csv作为名称立即加载到结构化数组中?

Numpy - 将具有第一行的csv作为名称立即加载到结构化数组中?