【问题标题】:Duplicating __m256i datatype复制 __m256i 数据类型
【发布时间】:2016-08-17 04:51:39
【问题描述】:

我有兴趣将 __m256i 数据类型(用于英特尔内部 AVX 指令)的数据复制到新的 __m256i。

我知道我可以将 AVX 寄存器中的数据存储到内存中,然后从内存中,我可以将数据加载到新寄存器中。但是,有没有更简单的方法(即它的专用指令),我可以直接“克隆”寄存器,而无需先使用将其存储到内存然后再次加载它的操作?

我想,我可以在我的寄存器中添加一个空寄存器,然后返回一个新的 __m256i 类型,该类型可以加载到一个寄存器中......然而,这似乎有点小技巧,需要我使用一些在某个时候创建​​一个新的空 __m256i 虚拟对象的操作。

对不起,如果这是一个简单的问题(这是一个简单的问题)。我只是找不到可以为我做这件事的单一内在函数。

【问题讨论】:

    标签: simd intrinsics avx avx2


    【解决方案1】:

    你可以用通常的方式做作业,例如

    __m256i v1 = _mm256_set1_epi32(42);
    __m256i v2 = v1;
    

    编译器通常会生成一个vmovdqa 指令(或者它甚至可能只是优化掉寄存器副本)。

    【讨论】:

    • 啊,太棒了。很难在 Intel Intrinsics 登录页面上找到有用的信息,但这真的很容易!我原以为这会被当作引用处理,所以它们指向同一个数据元素!
    • 是的,现在可能看起来非常明显,但是您可以像对待任何其他简单类型一样对待__m256i,例如int,就许多基本操作而言。正如int 可能被编译器分配给通用标量寄存器一样,__m256i 可能被分配给ymm 寄存器。
    【解决方案2】:

    您可以使用 MOVDQA 轻松地将 x86 程序集中的 YMM 寄存器复制到另一个寄存器中

    vmovdqa ymm0, ymm1
    

    this对应的内在函数是

    _mm256_store_si256(_m256i *p, __m256i a);
    

    编译器应该优化掉所有的变量引用。

    【讨论】:

    • 非常感谢。我完全误解了英特尔的文档。这有帮助!
    • 我不建议编写 store 内在变量来在局部变量之间复制数据,因为您不希望实际存储到内存中。 store / storeu 内部函数主要用于向编译器传达对齐保证,否则您只需编写 *p = a;
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2013-08-23
    • 1970-01-01
    • 2015-11-16
    • 2018-10-15
    • 2012-07-19
    • 2014-09-10
    • 2019-02-11
    相关资源
    最近更新 更多