intrinsics - 如何广播 __m256i 的最低单词?
问题描述
我正在尝试使用内在函数编写 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)。
解决方案
以下应该有效:
__m256i broadcast_word(__m256i x){
return _mm256_broadcastw_epi16(_mm256_castsi256_si128(x));
}
使用内在函数,_mm256_castsi256_si128
是从 256 位转换为 128 位的正确方法。
使用Godbolt 编译器资源管理器,它编译为(gcc 7.3):
broadcast_word:
vpbroadcastw ymm0, xmm0
ret
推荐阅读
- java - 代号一 - 对话框关闭/取消/点击外部事件侦听器
- c# - 如何转换 ICollection
> 列出 - > 在 C# 中
- python - 想要使用 python 从最旧的邮件中获取 Outlook 邮件到最新的邮件
- google-apps-script - 在共享驱动器中的两个文件夹之间移动文件 - 无法在共享驱动器项目上使用此操作
- c - CMake 在 sysroot 中找不到 libcurl
- c# - 将相同对象的列表合并为具有布尔属性 C# 的单个对象
- python - 如何仅为具有给定列表中值的行添加列和设置值
- angular - 基于集合查询结果的Angular Route Guard
- mysql - 从另一个表中获取两个日期之间的sql记录
- sql-server - SQL SP 中未附加 WHERE 子句