【问题标题】:How do I broadcast the lowest word of a __m256i?如何广播 __m256i 的最低单词?
【发布时间】:2019-05-26 20:48:17
【问题描述】:

我正在尝试使用内在函数编写 AVX2 代码。想知道如何使用英特尔内在函数将 YMM 中的最低单词广播到整个 YMM。我知道用汇编代码我可以写

vpbroadcastw ymm1, xmm0

因为ymm0的最低字也是xmm0的最低字。我有一个变量 x,它是 YMM 中的一个值。但是

_mm256_broadcastw_epi16((__m128i) x)

其中 x 是 __m256i 返回错误——无法转换两个不同大小的东西。

rq_recip3_new.c:381:5: error: can’t convert a value of type ‘__m256i {aka __vector(4) long long int}’ to vector type ‘__vector(2) long long int’ which has different size

我认为这并不重要,但我的机器使用 gcc 6.4.1 和 7.3(分别为 Fedora 25 和 Ubuntu LTS 16.04)。

【问题讨论】:

    标签: intrinsics avx2


    【解决方案1】:

    以下应该有效:

    __m256i broadcast_word(__m256i x){
        return _mm256_broadcastw_epi16(_mm256_castsi256_si128(x));
    }
    

    对于内在函数,_mm256_castsi256_si128 是从 256 位转换为 128 位的正确方法。

    使用 Godbolt Compiler Explorer 编译为 (gcc 7.3):

    broadcast_word:
      vpbroadcastw ymm0, xmm0
    ret
    

    【讨论】:

    • @Bo-YinYang:太好了!随时为答案投票。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2014-03-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多