GCC avx2intrin.h(版本 X-9.2)中缺少 _mm_broadcastsd_pd

Posted

技术标签:

【中文标题】GCC avx2intrin.h(版本 X-9.2)中缺少 _mm_broadcastsd_pd【英文标题】:_mm_broadcastsd_pd missing in GCC avx2intrin.h (versions X-9.2) 【发布时间】:2019-10-07 13:16:58 【问题描述】:

刚刚发现,英特尔内在函数指南 (link) 中列出的 _mm_broadcastsd_pd 并未在 GCC avx2intrin.h 中实现。我用最新的 GCC 版本在 Godbolt 上测试了一个小例子,它不会编译 (Example GCC)。 Clang 可以 (Example Clang)。在我的计算机上也是如此(GCC 8.3)。

我应该提交错误报告还是有什么特别的原因不包括在内?我的意思是,当然,_mm_movedup_pd 做了完全相同的事情,并且 clang 实际上为两个内在函数生成了相同的程序集,但我认为这不应该成为排除它的理由。

问候

编辑

创建了一个错误报告:link

【问题讨论】:

【参考方案1】:

并非所有编译器都具有内在属性的所有别名(同一事物的不同名称)。除了在 Godbolt 上尝试它们之外,IDK 如何找出哪些是可移植到主要 4 种编译器的当前版本的。

但是,是的,GCC/clang 确实接受有关缺少 _mm 内在函数的错误,尤其是英特尔文档中的错误。

_mm_broadcastsd_pd 被英特尔记录为 movddup 的内在属性,因此您不会错过任何东西。更重要的是,它有点误导,因为没有vbroadcastsd xmm, xmm,only with a YMM or ZMM destination。 (_mm256_broadcast_sd(double *a);_mm256_broadcastsd_pd(__m128d a);

asm 参考手册甚至没有在 vbroadcast 或 the movddup entry 中记录 _mm_broadcastsd_pd;它只在内在指南中。

GCC 可能想要添加这个,特别是因为 clang 有它。将_mm_broadcastsd_pd 用作别名对于正在寻找它但对asm 不够了解以知道他们需要movddup 的人会很有用。 (或使用 AVX 3 操作数指令,movlhpsunpcklpd 相同,相同)

【讨论】:

谢谢。正如你所说,我也看到没有_mm256_broadcastsd_pd(__m256d)。但这不是什么大问题,因为可以使用_mm256_castpd256_pd128。还是有点混乱。我将提交错误报告并将链接放入问题中。让我们看看会发生什么。 @wychmaster:没有_mm256_broadcastsd_pd(__m256d),因为asm 指令是vbroadcastsd ymm, xmm,而内在函数反映了这一点。 SD 源是单个double,就像__m128d 的低元素一样。这就是为什么 _mm256_broadcastsd_pd 有一个 __m128d 参数。 _pd 后缀表示源是向量的低元素,而不是来自内存的广播 load,带有 double* 参数。 __m256d _mm256_movedup_pd 是两个车道内广播,根本不是一回事。 好的。我想如果一个人知道相应的 asm 指令,很多事情确实更有意义。仍在学习基础知识;)。提交了错误报告。链接在问题中。

以上是关于GCC avx2intrin.h(版本 X-9.2)中缺少 _mm_broadcastsd_pd的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX 上的 GCC——多个版本的 gcc

mac上怎么切换 gcc 的版本

GCC:在 GCC 版本之间伪装

linux下升级gcc版本(gcc-7)

gcc 低版本换高版本

CentOS下安装高版本GCC