为什么单独的浮点寄存器英特尔x64处理器

为什么单独的浮点寄存器英特尔x64处理器

xmm0-xmm15为什么有单独的浮点寄存器英特尔 x64CPU?

我知道xmm也用于矢量运算,其中某些指令(SSE*)在一个寄存器中对多个数字执行。除此之外,为什么要使用xmm0-xmm15寄存器而不是通用寄存器 rax、rbx、rcx、rdx、rbp、rsp、rdi、rsi r8-r15?

答案1

一些通用的答案:

  1. 您说对了 - XMM 寄存器可让您进行矢量操作,例如各种版本的 SSE、AVX 等。可以使用矢量操作进行一些非常复杂的处理。例如,图像中的像素通常包含几个相关的颜色通道(例如红色、绿色、蓝色和 alpha)。对像素进行矢量操作可以大大提高性能。考虑到如今处理器的并行性越来越强,而不是被赋予更快的时钟速度(22 核 Xeon 处理器,有人要吗?),对更多数据并行执行更多 CPU 密集型操作是一件好事。在内存带宽有限的情况下,它有助于让更多内核同时运行一项作业。

  2. 如果您不只有微小的模块化函数(有时我们都必须面对庞大而复杂的逻辑流程),则寄存器越多效率越高。理想情况下,执行最繁重的代码段应该以最少的 RAM 访问完成,因此能够将所有重要变量放入寄存器中是一件好事。

请注意,向量运算不仅适用于浮点;SSE 指令可以用于许多整数运算。例如,通过使用过去 15 年内制造的处理器(即仅支持 SSE2),通过 128 位指令获取充满数据的缓存行,可以编写高效的内存移动代码。

最后但并非最不重要的一点是,将数据传入和传出 XMM 寄存器的过程可能有点困难。除非您仔细规划了系统设计,否则在使用不使用向量的“旧方式”寄存器和使用向量之间来回切换可能会效率低下。

但是,一旦你开始思考向量操作能为你做什么,一些很酷的新视野就会打开。例如,想象一个循环对象,它有助于多重嵌套的 for 循环,例如,X 和 Y 坐标保存在一个向量中。只需一个 PADDD (_mm_add_epi32) 指令就可以增加外循环变量并重置内循环变量以准备下一组迭代。

方便的参考:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/

相关内容