如何广播 __m256i 的最低字?
How do I broadcast the lowest word of a __m256i?
我正在尝试使用内部函数编写 AVX2 代码。想知道如何使用 Intel intrinsics 将 YMM 中的最低字广播到整个 YMM。我知道用汇编代码我可以写
vpbroadcastw ymm1, xmm0
因为ymm0的最低字也是xmm0的最低字。我有一个变量 x,它是 YMM 中的一个值。但是
_mm256_broadcastw_epi16((__m128i) x)
其中 x 是 __m256i returns 一个错误 -- 无法转换两个不同大小的东西。
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)。
以下应该有效:
__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
我正在尝试使用内部函数编写 AVX2 代码。想知道如何使用 Intel intrinsics 将 YMM 中的最低字广播到整个 YMM。我知道用汇编代码我可以写
vpbroadcastw ymm1, xmm0
因为ymm0的最低字也是xmm0的最低字。我有一个变量 x,它是 YMM 中的一个值。但是
_mm256_broadcastw_epi16((__m128i) x)
其中 x 是 __m256i returns 一个错误 -- 无法转换两个不同大小的东西。
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)。
以下应该有效:
__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