许多SSE“mov”指令指定它们正在移动浮点值。例如:
为什么这些指令不会简单地表示它们移动32位或64位值?如果它们只是移动位,为什么指令指定它们是浮点值?当然,无论你是否将这些位解释为浮点,它们都能工作吗?
答案 0 :(得分:12)
我想我找到了答案:一些微体系结构在不同的执行单元上执行浮点指令而不是整数指令。当指令流保持在同一“域”(整数或浮点)内时,您会获得更好的总体延迟。 Agner Fog的优化手册中标题为“数据旁路延迟”的部分详细介绍了这一点:http://www.agner.org/optimize/microarchitecture.pdf
我在这个类似的SO问题中找到了这个解释:Difference between MOVDQA and MOVAPS x86 instructions?
答案 1 :(得分:4)
如果有人关心,这正是为什么在Agner Fog的vectorclass中他有单独的向量类与boolean float(Vec4fb)和布尔整数(Vec4i)一起使用 http://www.agner.org/optimize/#vectorclass
在他的手册中,他写道。 “我们之所以为其定义了一个单独的布尔矢量类 使用浮点向量是因为它使我们能够生成更快的代码。 (许多 现代CPU具有用于整数向量和浮动的单独执行单元 点向量。有时可以在中执行布尔运算 浮点单元,从而避免在两者之间移动数据的延迟 单元)。“
关于SSE和AVX的大多数问题都可以通过阅读他的手册来回答,更重要的是看看他的矢量类中的代码。