gpt4 book ai didi

c - 为什么 gcc 只用 _mm_set_ss 添加这个 movss 指令?

转载 作者:太空狗 更新时间:2023-10-29 15:02:42 29 4
gpt4 key购买 nike

使用 SSE 考虑这两个函数:

#include <xmmintrin.h>

int ftrunc1(float f) {
return _mm_cvttss_si32(_mm_set1_ps(f));
}

int ftrunc2(float f) {
return _mm_cvttss_si32(_mm_set_ss(f));
}

对于任何输入,两者在行为上完全相同。但是汇编器输出不同:

ftrunc1:
pushl %ebp
movl %esp, %ebp
cvttss2si 8(%ebp), %eax
leave
ret

ftrunc2:
pushl %ebp
movl %esp, %ebp
movss 8(%ebp), %xmm0
cvttss2si %xmm0, %eax
leave
ret

也就是说,ftrunc2额外使用了一条movss指令!

这正常吗?有关系吗?当您只需要设置底部元素时,_mm_set1_ps 是否总是优先于 _mm_set_ss


使用的编译器是带有 -O3 -msse 的 GCC 4.5.2。

最佳答案

_mm_set_ss 直接映射到汇编指令 (movss)。但是 _mm_set1_ps 没有。

根据我在 GCC、MSVC 和 ICC 上看到的内容:

一对一映射到汇编指令的 SSE 内在函数通常被视为“原样”——一个黑盒子。所以编译器只会优化适用于整个指令本身的优化。但它不会尝试进行任何需要对单个 vector 元素进行数据流/依赖性分析的优化。

_mm_set1_ps_mm_set_ps 内在函数不映射到单个指令,大多数编译器都有特殊情况处理。据我所知,我在上面列出的所有三个编译器尝试对单个元素执行数据流分析优化。


当你把它们放在一起时,第二个例子留下了 movss 因为编译器没有意识到前 3 个元素并不重要。 (它不会尝试“打开”_mm_set_ss 内在函数。)

关于c - 为什么 gcc 只用 _mm_set_ss 添加这个 movss 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202801/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com