我正在尝试使用内在函数编写AVX2代码.想知道如何使用英特尔内在函数将YMM中的最低字广播到整个YMM.我知道用汇编代码我可以写
vpbroadcastw ymm1, xmm0
Run Code Online (Sandbox Code Playgroud)
因为ymm0的最低字也是xmm0的最低字.我有一个变量x,它是YMM中的一个值.但
_mm256_broadcastw_epi16((__m128i) x)
Run Code Online (Sandbox Code Playgroud)
其中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).
以下应该有效:
__m256i broadcast_word(__m256i x){
return _mm256_broadcastw_epi16(_mm256_castsi256_si128(x));
}
Run Code Online (Sandbox Code Playgroud)
使用内在函数,_mm256_castsi256_si128是从256位转换为128位的正确方法.
使用Godbolt Compiler Explorer,编译为(gcc 7.3):
broadcast_word:
vpbroadcastw ymm0, xmm0
ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |