- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我查看最新处理器的图表和概述时[1],我从未看到提及 MMX 寄存器 MM0 - MM7。但从规范来看,它们似乎仍然存在。可以依赖它们出现在所有支持 SSE 的处理器中吗?除了更旧的 FPU 堆栈之外,它们是否与其他任何堆栈冲突?它们和一般的64位的物理寄存器是一样的吗?
虽然 XMM 和 YMM 对于向量来说要好得多,但我偶尔想使用 MMX 寄存器来存储否则会溢出到堆栈的值。 Speedwise 这看起来好一点,而且有时我想避免额外的存储和负载。
最佳答案
SSE1 意味着 MMX,所以支持 x86-64 可以保证 MMX(因为 SSE2 是 x86-64 的基准)。
它们是 80 位 x87 寄存器的别名,而不是通用整数寄存器!长模式不会改变 MMX 的工作方式。
所有现代 CPU 都支持 64 位,因此在所有模式下都可以使用 MMX。即使仅嵌入 32 位 AMD Geode CPUs有 MMX(但没有 SSE)。
<小时/>当您拥有 16x XMM 寄存器 + 16x 64 位 GP 寄存器时,MMX 很少值得使用。 存储/重新加载并不可怕,特别是如果重新加载可以使用内存源操作数。
与存储/重新加载相比,将数据移入/移出 MMX 寄存器的额外 ALU uops 通常不值得。 Reload 通常可以作为内存源操作数进行微融合,ALU 执行端口压力很容易成为问题。
如果您在禁用缓存的情况下做了一些特殊的事情,那么当然,但是如果您可以使其远离关键路径,那么通常存储转发可以使存储/重新加载变得高效。 (它确实有大约 5 个周期的延迟)。
如果您确实想要在 XMM 和 GP 寄存器之间移动数据,通常是 movd
/movq
或 pinsrd
/pextrd
是一个不错的选择,而不是存储/重新加载。我的意思是,外循环中 GP 或 XMM 寄存器的溢出/重新加载通常比 2x movq 或 movq2dq xmm0, mm0 更好。
事实上,在 Skylake 上,一个 movq2dq
花费 2 uops。movdq2q
也是如此。 (不过,与 GP 寄存器之间的movq
仍然只有 1 uop,与 XMM 和 GP 寄存器之间的传输具有相同的端口 0 或端口 5 限制)。
此外,在函数中使用 MMX 会在函数末尾(或者如果您想符合 ABI 的话,在任何函数调用之前)花费一条 emms
指令。 MMX 寄存器在正常调用约定中都会被调用破坏(事实上,FPU 必须处于 x87 状态而不是 MMX 状态)。
在现代 CPU 上,MMX 绝对不如 XMM 高效。实际上,将其用于存储以外的任何用途通常比 SSE2 更糟糕(如果您想在 64 中工作,则使用 movq 加载/存储并忽略 XMM 寄存器的高字节)位 block )。
例如,在具有 movaps xmm,xmm
的 mov-elimination 的 Intel/AMD CPU 上,使用 movq xmm1, xmm0
进行 MMX 寄存器复制仍然需要 ALU uop,并且仍有 1 个周期的延迟。 (两者仍然需要前端花费一个 uop;mov-elimination 仅消除 ROB 条目之外的延迟和后端成本。)
此外,Skylake 对于某些指令的 XMM 版本的吞吐量比 MMX 版本更好。例如paddb/w/d/q mm,mm
在 p05 上运行,但 paddb/w/d/q xmm,xmm
在 p015 上运行。许多其他操作(例如 pavg*、pmadd* 和移位)可以在 XMM 寄存器的 p01 上运行,但对于 MMX 寄存器只能在端口 0 上运行。 (https://agner.org/optimize/)
与 x87 FPU 一样,它仍然支持旧代码,但支持它的执行单元较少。这还不算太糟糕,所以像 x264 和 FFmpeg 这样的软件仍然拥有大量 MMX 代码,这些代码可以自然地在 64 位 block 中工作,因此不会受到太严重的影响。
在许多情况下,128 位 AVX 版本的整数指令可能是避免寄存器复制 mov
指令的最佳选择。
关于assembly - 现代处理器中是否始终存在 MMX 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16981000/
当我使用路径文件上的快捷方式在文件之间移动时,似乎我不仅仅是在文件之间移动。 我使用>转到一个文件,在该文件中我更改光标的位置并执行某些操作,然后按 gf noremap 关于vim 通过快捷方式直
我正在尝试使用 Pong P. Chu 的书来学习 Verilog。我有一个关于如何评估和实现始终 block 的问题。作者代码中的风格让我感到困惑。 在此示例中,他编写了一个具有两个输出寄存器“y1
我正在尝试制作一个聊天应用程序,因此我需要它始终接收服务器信息。因此,当请求完成时,在: http.onreadystatechange=function(){ 我再次调用该函数,因此: reques
当您在 always block 敏感度列表中使用通配符 @* 时,我对什么被视为输入有点困惑。例如,在下面的示例中,哪些信号被解释为导致 always block 被重新评估的输入? 据我了解,cl
我有一个充当调试器的程序。我为线程设置了一个 hw bp,将 dr0 设置为我希望 bp 所在的地址,将 dr7 设置为 1,因为我希望 bp 在每次执行该地址时生成一个事件。 它有效,但现在的问题是
如何每次都以管理员身份在 Windows 上运行 git bash。 操作系统 - Windows 10 家庭版 64 位 最佳答案 我在 Google 上找到了这个结果: 将 Git Bash 设置
使用 accept() 时或 getpeername() , sockaddr_storage总是有 ss_family=AF_INET6 : struct sockaddr_storage addr
我在 Cordova 方面还有另一个问题。我想在 Cordova 7.1.0 中使用插件“cordova.custom.plugins.exitapp”和“cordova-plugins-printe
我试图让模块通过 ISE 12.4 中的语法检查,但它给了我一个我不明白的错误。首先是代码片段: parameter ROWBITS = 4; reg [ROWBITS-1:0] temp; genv
我正在使用Cordova开发适用于iOS的应用程序,其中包括地理位置功能(我使用官方插件https://github.com/apache/cordova-plugin-geolocation)。我在
我想知道是否有可能只在敏感列表中的多个信号一起变化时才执行 always block 。 例如,假设我有一个信号“in”和另一个“posedge clk”。我希望在两个信号都发生变化时执行 alway
我需要实现一种算法来访问数据库来检查最后一个元素,以便计算新的元素。当然,第一次这是不可能的,因为数据库是空的,我得到 IndexOutOfBoundsException) index 0 reque
我正在利用我在网上找到的画廊系统,根据鼠标图像的接近程度,它会按比例增长。 链接:Gallery 好吧,我调整了代码以响应(如您所见正在 build 中)并且没有明显的问题。我的问题在更改分辨率时开始
我正在创建一个 kiosk 应用程序,我想确保它无论如何始终位于其他 Windows 应用程序和 Windows 任务栏之上。 我已经阻止了 Windows 键盘命令(alt-tab 等),但仍有可能
我即将开始一个新的 React 项目,并尝试利用我以前的知识来创建一些关于我如何构建应用程序的规则。 有些事情我认为是真的: Redux 保存整个应用程序的“主要”数据 如果需要跨应用程序共享,Red
当你打开 VS Code 时,终端默认是在底部打开的。您可以单击该图标将其向右移动。我想知道是否有办法将右侧打开设置为默认值。 谢谢。 最佳答案 是的 - 在 v1.20 中引入了设置 workb
我有一个Events表,其中包含各种类型的事件。我只关心其中一种类型。因此,我编写的每个查询都以开头 Events.objects.filter(event_type="the_type").\
我在单例中创建了一个Timer,并且我一直在努力解决为什么Timer没有触发。我查看了这里的帖子,但没有找到我认为可以直接回答我的问题的帖子。 class ConnectionStateMonitor
我在 TableViewController 中显示了一组项目。它们在 TVC 中正确显示。下面的代码会继续,但它只会继续到我的 MKMapItem 数组的 indexPath 0,而不是被单击的单元
我的 VC 是这样的: var coins = 50 // coins override func viewDidLoad() { super.viewDidLoad() if(SKP
我是一名优秀的程序员,十分优秀!