- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我尝试 64 位 ARM 架构的过程中,我注意到一个特殊的速度差异,这取决于是使用 br
还是 ret
从子例程返回.
; Contrived for learning/experimenting purposes only, without any practical use
foo:
cmp w0, #0
b.eq .L0
sub w0, w0, #1
sub x30, x30, #4
ret
.L0:
ret ; Intentionally duplicated 'ret'
这个子例程的目的是让 foo
的调用者“重新输入” foo
w0
次,方法是使 foo
返回到首先调用 foo
的指令(即紧接在 x30
指向的指令之前的指令)。通过一些粗略的计时,w0
是一些足够高的值,平均花费大约 1362 毫秒。奇怪的是,将第一个 ret
替换为 br x30
会使它的运行速度提高两倍,平均只需要 550 毫秒左右。
如果将测试简化为仅使用简单的 ret
/br x30
重复调用子例程,则计时差异就会消失。是什么让上面设计的带有 ret
的子例程变慢了?
我在某种 ARMv8.2(Cortex-A76 + Cortex-A55)处理器上对此进行了测试。我不确定 big.LITTLE 会在多大程度上扰乱时间,但它们在多次运行中似乎非常一致。这绝不是一个真正的[微]基准测试,而是一个“如果运行 N 次大约需要多长时间”的东西。
最佳答案
大多数现代微体系结构都有一个特殊的调用/返回预测器,它们往往在实际程序中相互匹配。 (并且对于具有许多调用点的函数来说,很难以任何其他方式预测返回值:它是一个间接分支。)
通过手动处理返回地址,您会做出错误的返回预测。所以每次 ret
都会导致分支预测错误,除了你没有使用 x30
的那个。
但是,如果您使用间接分支而不是专门识别为 ret
习惯用法的分支,例如br x30
,CPU 使用其标准的间接分支预测方法,当 br
重复到达同一位置时,该方法表现良好。
Google 快速搜索发现了一些来自 ARM for Cortex-R4 的信息,关于 32 位模式(4 入口循环缓冲区)微架构上的返回预测器堆栈:https://developer.arm.com/documentation/ddi0363/e/prefetch-unit/return-stack
对于 x86,https://blog.stuffedcow.net/2018/04/ras-microbenchmarks/是一篇关于一般概念的好文章,以及一些关于各种 x86 微体系结构如何在面对诸如错误推测执行 call
或 ret< 之类的事情时保持其预测准确性的一些细节
必须回滚的指令。
(x86 有一个实际的 ret
操作码;ARM64 是相同的:ret
操作码类似于 br
,但提示这是一个函数返回。其他一些 RISC,如 RISC-V 没有单独的操作码,只是假设使用链接寄存器的分支到寄存器是一个返回。)
关于assembly - 从人为的子例程返回到修改后的返回地址时,BR/RET 时序差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70546711/
我想选择一个类的所有元素。然后将该类更改为另一个类。 0.5 秒后,我想将元素恢复到原来的类。我必须连续这样做 8 次。即使我的代码实现了(以某种方式),我也看不到按钮的颜色变化。谁能帮我 ?我猜这是
我目前正在尝试用 C++ 编写一个 NES 模拟器,作为一个夏季编程项目,为下一学年的秋季学期做准备(我已经有一段时间没有编码了)。我已经编写了一个 Chip8 模拟器,所以我认为下一步是尝试编写一个
我有 2 个函数依次调用,x 和 y 是全局变量。 function setVariables() { x = 2; y = 10; }; function useVaria
我正在尝试以重复的方式播放 1000 毫秒的 wav 文件。因此,播放 1000 毫秒,然后播放 1000 毫秒的静音,然后再次播放 1000 毫秒的音频,... 但是当我在此过程中打印计时时,我注意
我正在为一个特殊的相机编写一个内核模块,通过 V4L2 处理帧到用户空间代码的传输。然后我在应用程序中做很多用户空间的事情。 时间在这里非常关键,所以我一直在做大量的性能分析和普通的旧 std::ch
据我了解,awakeFromNib 始终会在 viewDidLoad 之前调用。 所以我有一个 UITableViewController 的子类,它是从 xib 文件中取消存档的。 我在里面定义了这
我的powershell脚本运行缓慢,有什么办法可以分析powershell脚本吗? 最佳答案 在这里发布您的脚本真的有助于给出准确的答案。 您可以使用 Measure-Command 来查看脚本中每
我的CQRS / ES设计中有时间问题。为了便于讨论,让我们基于Microsoft的 有关此主题的示例, session 管理(https://msdn.microsoft.com/en-us/lib
我正在使用 RX 进行一些(非常基本的)事件订阅:- public void StartListening(IObservable observable) { subscription = ob
我会试着问我的问题,这样它就不会以一个简单的争论话题结束。 我最近进入了一个用 C# 编码的应用程序,我正在发现异常机制。我和他们有过一些不好的经历,比如以下 // _sValue is a stri
我正在阅读 Cortex M4 TRM 以了解指令执行周期。但是,那里有一些令人困惑的描述 在 Table of Processor Instuctions , STR需要 2 个周期 . 稍后在 L
我需要在 GPU 端处理一组绘图调用所需的时间跨度。 OpenGL 3.2+ 具有“GL_ARB_timer_query”扩展名。不幸的是,MacOSX 仍然不支持该扩展。 你如何能够在 gpu 端测
我正在 try catch 屏幕而不包括我的应用程序窗口。为此,我首先调用 setVisible(false),然后调用 createScreenCapture 方法,最后调用 setVisible(
我们试图实现的功能的简短描述:我们在左边有一个源对象列表,一个人可以将新项目从列表拖到右边的列表中,项目因此被添加到列表中在右侧;他们还可以从右侧的列表中删除项目。右侧的列表在更改时会被保存。 (我认
我是一名优秀的程序员,十分优秀!