- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 Haswell 端口 0 上的分支单元的功能,从一个非常简单的循环开始:
BITS 64
GLOBAL _start
SECTION .text
_start:
mov ecx, 10000000
.loop:
dec ecx ;|
jz .end ;| 1 uOP (call it D)
jmp .loop ;| 1 uOP (call it J)
.end:
mov eax, 60
xor edi, edi
syscall
使用 perf
我们看到循环以 1c/iter 运行
Performance counter stats for './main' (50 runs):
10,001,055 uops_executed_port_port_6 ( +- 0.00% )
9,999,973 uops_executed_port_port_0 ( +- 0.00% )
10,015,414 cycles:u ( +- 0.02% )
23 resource_stalls_rs ( +- 64.05% )
我对这些结果的解释是:
但是,我们也可以看到 RS 永远不会充满。
它最多可以以 2 uOPs/c 的速率调度 uOP,但理论上可以得到 4 uOPs/c,从而在大约 30 c 内产生完整的 RS(对于大小为 60 个融合域条目的 RS)。
据我了解,应该很少有分支错误预测,并且 uOP 应该全部来自 LSD。
所以我查看了 FE:
8,239,091 lsd_cycles_active ( +- 3.10% )
989,320 idq_dsb_cycles ( +- 23.47% )
2,534,972 idq_mite_cycles ( +- 15.43% )
4,929 idq_ms_uops ( +- 8.30% )
0.007429733 seconds time elapsed ( +- 1.79% )
确认 FE 是从 LSD1 发出的。
然而,LSD 从未发出 4 uOPs/c:
7,591,866 lsd_cycles_active ( +- 3.17% )
0 lsd_cycles_4_uops
我的解释是,LSD 无法从下一次迭代中发出 uOP2,从而每个周期仅将 D J 对发送到 BE。
我的解释正确吗?
源代码在 this repository .
<小时/>1 有一点差异,我认为这是由于允许进行一些上下文切换的迭代次数较多。
2 这在电路深度有限的硬件中听起来相当复杂。
最佳答案
循环中的所有微指令都是分支(每次迭代 2 个)。我认为 `lsd_cycles_4_uops 为零的原因是重命名器的限制。根据英特尔优化手册第 2.4.3.1 节:
The renamer can allocate two branches each cycle, compared to one branch each cycle in the previous microarchitecture. This can eliminate some bubbles in execution.
这是 Sandy 桥微架构部分的一个小节。但据我所知,这适用于所有后来的微架构。最大重命名吞吐量为每个周期 4 uops。但最多两个微指令可以是分支。因此,在这个所有微指令都是分支的示例中,即使在循环的第一次迭代中,LSD 在任何给定周期也永远无法提供超过 2 个微指令。
因此,每个周期将在 RS 中分配 2 个分支微指令,并且每个周期都可以调度这两个分支微指令(一个谓词采用,一个不采用)。所以RS占用率不会增长。
此限制不会影响程序的性能。每个周期执行 2 个分支 uops,每个周期提供 3 个 IPC,已经是最佳选择。
我试图找到一个可以捕获由于该限制而导致的分配器停顿的性能事件。事件 RESOURCE_STALLS.ANY
和 UOPS_ISSUED.ANY
(使用 cmask
=1 和 inv
=1)不会似乎与本例相关。 @IwillnotexistIdonotexist 建议使用IDQ_UOPS_NOT_DELIVERED.CORE
。我在下面展示了性能事件及其所有支持的变体的结果。我还提供了这些事件的正确含义,因为手册是错误的。 T
表示迭代次数。
IDQ_UOPS_NOT_DELIVERED.CORE
:计算分配器未使用的槽数。如果程序运行 C 个核心周期,则插槽总数为 4*C。测量值几乎等于2*T。由于周期数为T,所以时隙数为4*T,这意味着大约一半的发行时隙没有被利用。
IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE
:计算从 IDQ 传送零微指令的周期数。测量值可以忽略不计。
IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE
:计算从 IDQ 传送最多 1 个微指令的周期数。测量值可以忽略不计。
IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE
:统计IDQ最多发送2个uop的周期数:测量值几乎等于T。
IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE
:统计IDQ最多发送3个uop的周期数:测量值几乎等于T。
因此,由于执行时间几乎等于 T 个核心周期,因此我们可以得出结论,分配器在大多数周期中每个周期仅分配 2 个 uops,这等于调度率。
请注意,Haswell 和 Skylake 中的 RS 拥有未融合的微指令。因此每个条目可以容纳一个未融合的微指令。请参阅Footnote 2 。但这在这里并不重要,因为没有微融合。
关于assembly - LSD 能否从检测到的循环的下一次迭代中发出 uOP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52054585/
int main() { image_double image; ntuple_list out; unsigned int xsize,ysize,depth; int x,y,i,
我正在研究 Haswell 端口 0 上的分支单元的功能,从一个非常简单的循环开始: BITS 64 GLOBAL _start SECTION .text _start: mov ecx, 100
我编写了一些代码,旨在使用基数排序对字符串数组进行排序,从最低有效位开始。此函数假定所有字符串的长度都相同,并且每个字符都是小写的。 每当我进入为临时数组赋值的循环时,我都会遇到崩溃。你可以在这里看到
例如我有 这种带坐标的线。如何(使用什么算法)生成某种简单的 3d 场景,这意味着获取从相机到我们面对的墙壁的相对距离? 最佳答案 起点:http://en.wikipedia.org/wiki/Pi
我不确定为什么有人会使用 LSD 基数排序。 默沙东的优势: 它可以处理可变长度的字符串 它并不总是需要扫描整个字符串(它可以更快地决定顺序) 可以使用插入排序来规避计数排序的缺点。 最佳答案 LSD
我正在解决这个问题,即找到板球球场的爆裂折痕,我已经在某种程度上实现了我想做的事情,即我可以使用 opencv 中的 LSD 检测垂直线段,但我似乎不明白如何连接不同的线段在同一行上做一个完整的行。
因此,我正在为一个学校项目试验不同类型的基数排序,我们必须尽快对 500,000 个随机整数(我自己生成,每个整数的界限在 0 到 MaxValue 之间)进行排序。我首先进行了基数为 10 的 LS
本书"Introduction to Algorithms"提到基数排序的 LSD(最低有效数字)版本。然而,正如其他人在 stackoverflow 中指出的那样,也存在 MSD(最高有效数字)版本
我正在做一个最多 8 位数字的数字,但我不知道如何仅使用循环来制作表格。所以如果数字是 12345678 它应该垂直显示12345678 这就是我所拥有的,它的工作原理是我只想使用列而不是 print
在模拟器中测试应用内购买时,我遇到以下崩溃: Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneS
您好:我正在尝试使用 R 中的 agricolae 包计算某些数据的 LSD。从文档中看起来很简单,但结果中缺少 LSD 的一部分。 我发现其他一些人也遇到过这个问题,但无法找到他们问题的答案。 ht
从深层链接(具有应用特定方案的 URL)启动我的 iOS 应用时,我在日志中收到此错误: lsd[738] : LaunchServices: application launch failed -
我是一名优秀的程序员,十分优秀!