![为什么单独的浮点寄存器英特尔x64处理器](https://linux22.com/image/1505990/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8D%95%E7%8B%AC%E7%9A%84%E6%B5%AE%E7%82%B9%E5%AF%84%E5%AD%98%E5%99%A8%E8%8B%B1%E7%89%B9%E5%B0%94x64%E5%A4%84%E7%90%86%E5%99%A8.png)
xmm0-xmm15
为什么有单独的浮点寄存器英特尔 x64CPU?
我知道xmm
也用于矢量运算,其中某些指令(SSE*)在一个寄存器中对多个数字执行。除此之外,为什么要使用xmm0
-xmm15
寄存器而不是通用寄存器 rax、rbx、rcx、rdx、rbp、rsp、rdi、rsi r8-r15?
答案1
一些通用的答案:
您说对了 - XMM 寄存器可让您进行矢量操作,例如各种版本的 SSE、AVX 等。可以使用矢量操作进行一些非常复杂的处理。例如,图像中的像素通常包含几个相关的颜色通道(例如红色、绿色、蓝色和 alpha)。对像素进行矢量操作可以大大提高性能。考虑到如今处理器的并行性越来越强,而不是被赋予更快的时钟速度(22 核 Xeon 处理器,有人要吗?),对更多数据并行执行更多 CPU 密集型操作是一件好事。在内存带宽有限的情况下,它有助于让更多内核同时运行一项作业。
如果您不只有微小的模块化函数(有时我们都必须面对庞大而复杂的逻辑流程),则寄存器越多效率越高。理想情况下,执行最繁重的代码段应该以最少的 RAM 访问完成,因此能够将所有重要变量放入寄存器中是一件好事。
请注意,向量运算不仅适用于浮点;SSE 指令可以用于许多整数运算。例如,通过使用过去 15 年内制造的处理器(即仅支持 SSE2),通过 128 位指令获取充满数据的缓存行,可以编写高效的内存移动代码。
最后但并非最不重要的一点是,将数据传入和传出 XMM 寄存器的过程可能有点困难。除非您仔细规划了系统设计,否则在使用不使用向量的“旧方式”寄存器和使用向量之间来回切换可能会效率低下。
但是,一旦你开始思考向量操作能为你做什么,一些很酷的新视野就会打开。例如,想象一个循环对象,它有助于多重嵌套的 for 循环,例如,X 和 Y 坐标保存在一个向量中。只需一个 PADDD (_mm_add_epi32) 指令就可以增加外循环变量并重置内循环变量以准备下一组迭代。
方便的参考:
https://software.intel.com/sites/landingpage/IntrinsicsGuide/