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 操作数指令,movlhps
或 unpcklpd
相同,相同)
【讨论】:
谢谢。正如你所说,我也看到没有_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的主要内容,如果未能解决你的问题,请参考以下文章