如何广播__m256i的最低字?

时间:2018-12-29 09:56:39

标签: intrinsics avx2

我正在尝试使用内部函数编写AVX2代码。想知道如何使用Intel内部函数将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)。

1 个答案:

答案 0 :(得分:7)

以下方法应该起作用:

__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