问题标签 [micro-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
321 浏览

assembly - 8085; 为什么 RET 不需要像 CALL 那样的 6 个 T 状态 Fetch 循环?

CALL指令需要 5 个机器周期,即OPCODE-FETCH, MEMORY READ, MEMORY READ, MEMORY WRITE, MEMORY WRITE. CALL 的 OPCODE-FETCH 周期有 6 个 T 状态来处理 Stack Pointer 的递减

RET指令需要 3 个机器周期OPCODE-FETCH, MEMORY READ, MEMORY READ即使在这里,微处理器也必须像以前一样将堆栈指针增加两次才能弹出。但是,OPCODE-FETCH 循环只有 4 个 T 状态,这是为什么呢?

至于为什么,我有一个模糊的想法;inCALLPUSHSP 必须首先递减,不像RETor POPFETCH在周期的最后两个 T 状态中,仅考虑第一个减量。但为什么这需要两个 T 状态。同样,我真的不确定这一点。请帮忙。

0 投票
2 回答
222 浏览

assembly - 显示所需指令扩展的 x86 反汇编程序

我需要检查执行给定二进制对象(不是通用二进制文件,而是 的输出gcc -c somefile.s)所需的最小 x86 指令扩展集。手工操作既费时又容易出错。我正在寻找一个自动化的过程。

我需要的是一些二进制,它给定一个二进制对象作为输入,返回一个类似于objdumpx86 指令扩展的输出。类似于以下示例:

有没有类似的工具可用?

0 投票
1 回答
128 浏览

assembly - AVR 微架构怎么可能在 1 个时钟周期内从 GP-Register 获取 2 个操作数到 ALU?

根据 AVR 微控制器的数据表以及 AVR 架构的指令集数据表,某些指令,例如ADD,仅在 1 个时钟转换到 ALU 期间就可以获取存储在 GP 寄存器中的 2 个操作数。指令的指令字ADD包括 2 个 GP 寄存器地址;每个 5 位宽,一个用于目标/源,一个用于源。但是这是如何在硬件级别上实现的呢?当他们试图通过相同的直接寻址总线访问 GP 寄存器时,2 寄存器的 5 位不会相互干扰吗?

0 投票
2 回答
313 浏览

x86 - Ice Lake 的 48KiB L1 数据缓存的索引是如何工作的?

英特尔手动优化(2019 年 9 月修订)显示了 Ice Lake 微架构的 48 KiB 8 路关联 L1 数据缓存。

Ice Lake 的 48KiB L1 数据缓存及其 8 路关联性 1软件可见延迟/带宽会因访问模式和其他因素而异。

这让我很困惑,因为:

  • 有 96 套 (48 KiB / 64 / 8),这不是 2 的幂。
  • 一个集合的索引位和字节偏移的索引位相加超过 12 位,这使得4KiB 页面无法使用廉价 PIPT-as-VIPT-trick 。

总而言之,似乎缓存的处理成本更高,但延迟仅略有增加(如果有的话,取决于英特尔对该数字的确切含义)。

有了一点创造力,我仍然可以想象一种快速索引 96 集的方法,但第二点对我来说似乎是一个重要的突破性变化。

我错过了什么?

0 投票
2 回答
311 浏览

x86 - 负载操作是否在调度、完成或其他时间从 RS 释放?

在现代 Intel 1 x86 上,负载 uops 在发送2时、完成3介于4之间的某处时是否从 RS(预留站)释放?


1我也对 AMD Zen 和续集感兴趣,因此也可以随意加入,但为了使问题易于管理,我将其限制为英特尔。此外,AMD 的负载管道似乎与英特尔有所不同,这可能会使对 AMD 的调查成为一项单独的任务。

2这里的 Dispatch 是指离开 RS 去执行。

3这里的完成是指当加载数据返回并准备好满足依赖的微指令时。

4甚至在这两个事件定义的时间范围之外的某个地方,这似乎不太可能但可能。

0 投票
0 回答
74 浏览

pipeline - IO2I微架构的流水线图

对于给定的指令序列,我的管道是否正确?如果不是,你能指出我哪里出错了吗?mul编辑:我忘了添加指令的发布阶段。

0 投票
2 回答
2154 浏览

x86 - 存储缓冲区和行填充缓冲区如何相互交互?

我正在阅读 MDS 攻击论文RIDL: Rogue In-Flight Data Load。他们讨论了 Line Fill Buffer 如何导致数据泄漏。关于RIDL 漏洞和负载的“重放”问题讨论了漏洞利用的微架构细节。

阅读该问题后我不清楚的一件事是,如果我们已经有一个存储缓冲区,为什么我们需要一个行填充缓冲区。

John McCalpin 在 WC-buffer 如何与 LFB 相关中讨论了存储缓冲区和行填充缓冲区是如何连接的?在英特尔论坛上,但这并没有真正让我更清楚。

对于存储到 WB 空间,存储数据保留在存储缓冲区中,直到存储退出之后。一旦退役,数据可以写入 L1 数据缓存(如果该行存在并且具有写入权限),否则为存储未命中分配一个 LFB。LFB 最终会收到缓存行的“当前”副本,以便将其安装在 L1 数据缓存中,并将存储数据写入缓存。合并、缓冲、排序和“捷径”的细节尚不清楚......与上述合理一致的一种解释是,LFB 用作缓存行大小的缓冲区,其中存储数据在发送到之前被合并。 L1 数据缓存。至少我认为这是有道理的,但我可能忘记了一些事情......

我最近才开始阅读乱序执行,所以请原谅我的无知。这是我对存储如何通过存储缓冲区和行填充缓冲区的想法。

  1. 在前端安排存储指令。
  2. 它在存储单元中执行。
  3. 存储请求被放入存储缓冲区(地址和数据)
  4. 无效读取请求从存储缓冲区发送到缓存系统
  5. 如果它错过了 L1d 缓存,则将请求放入 Line Fill Buffer
  6. Line Fill Buffer 将无效读取请求转发到 L2
  7. 一些缓存接收到无效读取并发送其缓存行
  8. 存储缓冲区将其值应用于传入的缓存行
  9. 呃?行填充缓冲区将条目标记为无效

在此处输入图像描述

问题

  1. 如果存储缓冲区已经存在来跟踪超出的存储请求,为什么我们需要行填充缓冲区?
  2. 我的描述中的事件顺序是否正确?
0 投票
0 回答
148 浏览

x86 - 在最近的英特尔上,拆分行/页面存储是否需要两个存储缓冲区条目?

一般理解,每个store分配一个store buffer entry,这个store buffer entry保存store数据和物理地址1

在存储跨越 4096 字节页面边界的情况下,可能需要两个不同的转换,每个页面一个,因此可能需要存储两个不同的物理地址。这是否意味着跨页存储需要 2 个存储缓冲区条目?如果是这样,它是否也适用于跨界商店?


1 ...也许还有一些/所有的虚拟地址来帮助存储转发。

0 投票
0 回答
152 浏览

x86 - 存储缓冲区是否保存现代 x86 上的物理或虚拟地址?

现代 Intel 和 AMD 芯片在提交到 L1 高速缓存之前具有大型存储缓冲区来缓冲存储。从概念上讲,这些条目保存存储数据和存储地址。

对于地址部分,这些缓冲区条目是保存虚拟地址还是物理地址,还是两者都有?

0 投票
1 回答
333 浏览

assembly - 除了 LL/SC 之外的 POWER 中的原子操作?

是否有任何 POWER ISA 包含除 LL/SC 之外的原子操作,例如原子加法、交换等?