- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
ARM允许使用后续存储对加载进行重新排序,以便以下伪代码:// CPU 0 | // CPU 1
temp0 = x; | temp1 = y;
y = 1; | x = 1;
可能会导致temp0 == temp1 == 1
(在实践中也是可以观察到的)。我无法理解这种情况如何发生;似乎按顺序提交会阻止它(据我的理解,几乎所有OOO处理器中都存在)。我的推理是:“负载在提交之前必须具有其值,在存储之前必须具有其值,并且存储的值直到其提交才对其他处理器可见。”
我猜测我的一个假设一定是错误的,并且必须满足以下条件之一:
指令不需要一路提交。以后的存储区可以安全地提交并在较早的加载之前可见,只要在存储区提交时核心可以保证先前的加载(以及所有中间指令)不会触发异常,并且加载的地址为保证与商店有所不同。
负载可以在知道其值之前提交。我不知道如何实现它。
在提交存储之前,它们可以变得可见。也许允许某处的内存缓冲区将存储转发到其他线程的加载,即使加载已排入较早的队列?
还有其他东西吗?
有很多假设的微体系结构特征可以解释这种行为,但是我最好奇的是现代弱序CPU中实际存在的那些。
最佳答案
您的假设要点对我来说都是正确的,只是您可以构建一个uarch,在其中检查负载(TLB)以确保确实可以发生之后,就可以从OoO核心中撤出负载。可能会有OoO exec CPU来执行此操作(更新:显然有)。
我认为x86 CPU要求负载才能使数据真正退休后才能到达,但是它们强大的内存模型仍然不允许LoadStore重新排序。因此ARM肯定会有所不同。
没错,退休之前其他任何核心都无法看到商店。那就是疯狂。即使在SMT core(一个物理核心上有多个逻辑线程)上,它也会将两个逻辑线程上的推测链接在一起,如果任何一个检测到错误推测,它们都必须回滚。这将使SMT的目的失去,即让一个逻辑线程利用其他线程的停顿。
(相关:使已退休但尚未提交给L1d的存储对于同一内核上的其他逻辑线程可见,这是某些真正的PowerPC实现如何使线程在存储的全局顺序上不一致的原因。Will two atomic writes to different locations in different threads always be seen in the same order by other threads?)
按顺序执行的CPU可以开始加载(检查TLB并写入加载缓冲区条目),并且只有在指令试图在准备好之前使用结果的情况下,它才会暂停。然后,包括存储在内的后续指令即可正常运行。基本上,这是有序管道中非糟糕性能所必需的;在每个高速缓存未命中(甚至只是L1d延迟)时停滞将是不可接受的。内存并行性即使在有序CPU上也是如此。它们可以具有多个加载缓冲区,以跟踪多个未决的高速缓存未命中。高性能(ish)的有序ARM内核(如Cortex-A53)仍广泛用于现代智能手机中。
因此,如果加载未命中缓存,但是存储命中了(并在较早的缓存缺失加载获取数据之前提交了L1d),则可以对LoadStore重新排序。 (Jeff Preshing intro to memory reording将该示例用于LoadStore,但根本不涉及uarch详细信息。)
在您检查了TLB和/或任何内存区域的内容之后,加载就不会出错。该部分必须在退出之前或到达有序管道的末端之前完成。就像坐在存储缓冲区中等待提交的已退休存储一样,坐在加载缓冲区中的已退休负载肯定在某个时刻发生。
因此,有序管道上的序列为:lw r0, [r1]
TLB命中,但未命中L1d缓存。加载执行单元将地址(r1
)写入加载缓冲区。以后任何尝试读取r0
的指令都将停止,但是我们可以肯定地知道负载没有故障。
将r0
绑定为等待该装载缓冲区准备就绪,lw
指令本身可以离开管道(退出),以后的指令也可以离开。
任何不读r0的其他指令。这将使有序管道停滞不前。sw r2, [r3]
存储执行单元将地址+数据写入存储缓冲区/队列。然后该指令可以退出。
探查加载缓冲区会发现此存储与挂起的加载不重叠,因此可以提交给L1d。 (如果它重叠了,则无论如何都无法提交它,直到MESI RFO完成,并且快速重启会将传入的数据转发到加载缓冲区。因此,即使不对每个存储进行探测,处理该情况也不会太复杂,但我们只看一下单独的缓存行案例,在这里我们可以对LoadStore进行重新排序)
致力于L1d =变得全球可见。当较早的负载仍在等待高速缓存行到达时,可能会发生这种情况。
对于OoO CPU,您需要某种方法将加载完成绑定回OoO内核,以获取等待加载结果的指令。我想这是可能的,但这意味着寄存器的架构/退休值可能不会存储在内核中的任何位置。由于错误推测而导致的管道刷新和其他回滚将不得不依赖于传入负载与物理和体系结构寄存器之间的关联。 (不过,在管道回滚上不刷新存储缓冲区已经是CPU要做的事情。位于存储缓冲区中的已退休但尚未提交的存储区无法回滚。)
对于具有很小的OoO窗口的Uarches来说,这可能是一个不错的设计想法,因为OoO窗口太小,无法接近隐藏缓存未命中。
我们有在OoO ARM上对LoadStore重新排序的实验证据:https://www.cl.cam.ac.uk/~pes20/ppc-supplemental/test7.pdf的7.1节显示了Tegra 2上“负载缓冲”的非零计数,该计数基于无序的Cortex-A9 uarch。我没有查找其他所有对象,但是我确实重写了答案,以表明这也是乱序CPU的可能机制。不过,我不确定情况是否如此。
关于arm - 如何使用有序提交来进行load-> store重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52215031/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!