问题标签 [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 回答
30 浏览

assembly - MIPS 有线逻辑 DPU

我是一名学生,我有一个关于 MIPS 的练习,我需要一些指导!下面是练习:

考虑 MIPS 架构的数据处理单元有线逻辑用于单个和多个机器周期的命令周期。描述命令的完整信息流和两种实现情况(单个和多个机器周期): bne $ 12, $ 4, -100 其中-100 是相对寻址命令的位移。特别是,报告产生的控制信号的所有值,以及在每个 DPU 中执行的微处理,按照它们执行的顺序,无论是否对任务有用 - 要求报告。另外,写入到达每个子单元和每个复用器的信息值。最后,在多个机器周期的情况下,请报告发生的A、B、C、IR和DR寄存器的寄存器,以及记录的值。考虑 $12 和 $4 寄存器分别包含指令周期 8 和 0 开始的值,而 PC 包含地址 0x1480a008。如果 $4 注册器在命令周期的开头包含值 8,上述命令的执行将如何演变;

谢谢...

0 投票
1 回答
160 浏览

x86 - 从程序员的角度来看,“新”处理器中的“新”是什么

我最近对了解低级计算很感兴趣。我了解当今广泛使用的计算机遵循 x86/x86-64 架构。

据我了解,架构,更具体地说,指令集架构 (ISA) 是程序员能够向 CPU 发出的指令集。

第一个问题,ISA 是在不断发展还是保持不变?

我认为它在不断发展(意味着新指令不断被添加/以前的指令被修改?)但是旧处理器如何能够执行用新指令编写的代码?(它不知道新指令,但应该能够执行代码,因为它具有 x86 架构)。编译器处理这个东西还是处理器?基本上,相同的指令集合如何能够在所有新旧处理器上运行?

最后,除了程序员不关心的微架构(如果我错了,请纠正我),程序员在处理新处理器时会看到哪些变化?由于微架构的变化,旧的指令可能会因为高效的执行而运行得很快。但是引入的新指令是否允许以前无法完成的事情?或者以前可以用一堆指令完成什么,但由于硬件的变化,现在可以用一个指令完成?新的寄存器?还要别的吗?

它是否做了类似的事情 - 如果处理器支持这个新的强大指令以更快地执行,那么使用新指令,否则回退到较慢的旧指令。如果是,谁执行这个 if - else 子句?编译器?如果没有,那会发生什么?

0 投票
1 回答
78 浏览

memory - 在向 DRAM 发出读取请求时,为什么我们需要读取标签和数据,而不仅仅是数据?

我正在阅读 David Patterson 和 John Hennessy 的计算机体系结构书。在第 2 章中提到,如果我们将标签存储在 DRAM 中,我们可能需要在两个周期内分别发出两次读取标签和数据的请求。我的问题是为什么我们需要请求标签?标签不只是地址的更高位吗?

0 投票
1 回答
161 浏览

performance - 为什么 jnz 不计算循环?

我在在线资源中发现 IvyBridge 有 3 个 ALU。于是我写了一个小程序来测试:

我编译并运行它perf

输出显示:

乍一看似乎是有道理的,因为在循环中有 3 条独立指令(2inc和 1 dec)使用 ALU,所以它们一起计算 1 个周期。

但我不明白的是为什么整个循环只有 1 个循环?jnz取决于 的结果dec rcx,它应该算 1 个周期,这样整个循环就是 2 个周期。我希望输出接近20,000,000 cycles.

我还尝试将第二个inc从更改inc rbxinc rax,这使得它依赖于第一个inc。结果确实变得接近20,000,000 cycles,这表明依赖关系会延迟一条指令,使它们不能同时运行。那么为什么jnz特别呢?

我在这里缺少什么?

0 投票
1 回答
90 浏览

performance - 为什么循环迭代中的依赖不能与前一个一起执行

我使用此代码来测试 IvyBridge 上循环迭代中依赖项的影响:

由于dec并且jnz将被宏融合到单个 uop,因此我的循环中有 3 个 uop,它们在注释中被标记。

uop B 依赖于 uop A,所以我认为执行会是这样的:

因此,每个迭代可以执行循环 1 个周期。

但是,该perf工具显示:

所以它是每个迭代 2 个周期,并且有 50% 的前端周期空闲。

是什么导致前端 50% 空闲?为什么假设的执行图无法实现?

0 投票
1 回答
108 浏览

assembly - 为什么在主内存中以 4K 步进 16 会导致没有 L1d 缓存未命中

我在 IvyBridge 上,想测试 L1d 缓存组织。我的理解如下:

在 IvyBridge 上,L1d 缓存有 32K 容量,64B 缓存线,8 路组关联。因此它有 32K/(64*8) = 64 个集合,给定一个主存储器addr,集合索引可以通过 计算(addr/64) % 64

因此,如果我将主内存步进 64*64 (4K),我将始终触摸相同的 L1d 集。一个集合只有 8 个缓存行,因此如果我用 16 个步骤循环它,我将获得几乎 100% 的 L1d 缓存未命中。

我编写了以下程序来验证:

令我惊讶的是,perf显示根本没有丢失 L1 缓存:

我的理解有什么问题?

0 投票
1 回答
436 浏览

assembly - mov r64, m64 是一个周期还是两个周期的延迟?

我在 IvyBridge 上,我编写了以下简单的程序来测量延迟mov

perf显示结果:

所以每次迭代都有 5 个周期的延迟。我从多个在线资源中搜索,L1缓存的延迟是4。因此mov它本身的延迟应该是1。

但是,Agner 指令表显示 IveBridgemov r64, m64有 2 个周期延迟。我不知道其他地方可以找到这种延迟。

我在上面的测量程序中犯了错误吗?为什么这个程序显示mov延迟是 1 而不是 2?

(我通过使用 L2 缓存得到了相同的结果:如果buf+raxL1 缺少 L2 命中,类似的测量显示mov rax, [buf+rax]有 12 个周期延迟。IvyBridge 有 11 个周期延迟 L2 缓存,所以mov延迟仍然是 1 个周期)

0 投票
1 回答
424 浏览

assembly - 在 IvyBridge 上的指针追踪循环中,来自附近依赖存储的奇怪性能影响。添加额外的负载会加快速度吗?

首先,我在 IvyBridge 上进行了以下设置,我将在注释位置插入测量有效负载代码。前 8 个字节buf存储buf自身的地址,我用它来创建循环携带的依赖:

情况1:

我插入有效载荷位置:

perf显示循环为 5.4c/iter。这有点容易理解,因为 L1d 延迟是 4 个周期。

案例2:

我颠倒了这两条指令的顺序:

结果突然变成9c/iter。我不明白为什么。因为下一次迭代的第一条指令不依赖于当前迭代的第二条指令,所以这个设置不应该与案例 1 不同。

我也用 IACA 工具对这两种情况进行了静态分析,但该工具不可靠,因为它对两种情况的预测结果相同 5.71c/iter,这与实验相矛盾。

案例3:

然后我在案例 2 中插入一条不相关的mov指令:

现在结果变成了 6.8c/iter。但是不相关的插入如何mov将速度从 9c/iter 提高到 6.8c/iter?

IACA 工具预测错误的结果,如前一种情况,它显示 5.24c/iter。

我现在完全糊涂了,如何理解上述结果?

编辑以获取更多信息:

在情况 1 和 2 中,有一个 address rax+8rax+8如果更改为rax+16或,则情况 1 和 2 的结果相同rax+24。但是当它改为rax+32:case 1 变成 5.3c/iter,case 2 突然变成 4.2c/iter。

编辑更多perf活动:

案例1 [rax+8]

案例2 [rax+8]

案例3 [rax+8]

案例2 [rax+32]

0 投票
2 回答
400 浏览

x86 - 为什么 jnz 需要 2 个周期才能在内循环中完成

我在常春藤桥上。jnz我发现内循环和外循环不一致的性能行为。

以下简单程序有一个固定大小为 16 的内部循环:

perf工具显示外部循环运行 32c/iter。它表明jnz需要 2 个周期才能完成。

然后我在 Agner 的指令表中搜索,条件跳转有 1-2 个“倒数吞吐量”,并带有注释“如果没有跳转则快”。

在这一点上,我开始相信上述行为是可以预料的。但是为什么jnz在外循环中只需要 1 个循环就可以完成呢?

如果我完全删除该.loop_inner部分,外部循环运行 1c/iter。行为看起来不一致。

我在这里缺少什么?

编辑以获取更多信息:

perf上述程序使用命令的结果:

是:

参考案例的perf结果:

是:

所以原因很清楚:LSD 在嵌套情况下由于某种原因停止工作。减小内部循环大小会稍微减轻缓慢,但不能完全减轻。

搜索英特尔“优化手册”,我发现如果循环包含“超过八个已采用的分支”,LSD 将不起作用。这以某种方式解释了这种行为。

0 投票
1 回答
115 浏览

x86 - CPUID 会序列化推测性数据缓存吗?

我从 Intel Vol.2 中的多个指令条目中找到了对推测数据缓存过程的描述。

例如,lfence

处理器可以自由地从使用 WB、WC 和 WT 内存类型的系统内存区域推测性地获取和缓存数据。这种推测性的取指可以随时发生,并且与指令执行无关。因此,对于 LFENCE 指令的执行,它没有被排序;数据可以推测性地在 LFENCE 指令执行之前、期间或之后被带入缓存。

另外,我从在线资源中发现,推测缓存也会将数据从更远的缓存移动到更近的缓存。

我想知道最强的序列化指令是否CPUID会阻止跨屏障的推测性缓存。

我已经搜索过CPUIDIntel Vol.2 中的条目和 Intel Vol.3 中的“序列化指令”部分。但它没有显示关于推测性数据缓存的任何内容。