- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近的 Intel CPU 的前端包含一个复杂的解码器和许多简单的解码器。复杂解码器可以处理解码为多个微操作的指令,而简单解码器仅支持解码为单个(融合域)微操作的指令。
是否所有 1-µop 指令都可以由简单解码器解码,或者是否存在只能由复杂解码器处理的 1-µop 指令?
最佳答案
不,有些指令只能解码 1/clock
Andreas 的评论表明 xor eax,eax
/setnle al
似乎有一个 1/clock 的解码瓶颈。我发现与 cdq
相同的事情: 读取 EAX,写入 EDX,从 DSB(uop 缓存)中运行得更快,并且不涉及部分寄存器或任何奇怪的东西,并且不需要破坏 dep 的指令。
更好的是,作为单字节指令,它只需一小段指令就可以击败 DSB。 (导致在某些 CPU 上的测试结果产生误导,例如在 Agner Fog 的表和 https://uops.info/ 上,例如 SKX 显示为 1c 吞吐量。)https://www.uops.info/html-tp/SKX/CDQ-Measurements.html与 https://www.uops.info/html-tp/CFL/CDQ-Measurements.html由于不同的测试方法,吞吐量不一致:只有 Coffee Lake 测试使用足够小的展开计数 (10) 进行测试,不会破坏 DSB,发现吞吐量为 0.6。 (考虑到循环开销后,实际吞吐量为 0.5,完全可以通过与 cqo
相同的后端端口压力来解释。IDK 为什么您会发现 0.6 而不是 0.55,而循环中 p6 只有一个额外的 uop。)
(Zen 可以以 0.25c 的吞吐量运行此指令;没有奇怪的解码问题,并且由每个整数 ALU 端口处理。)times 10 cdq
在 dec/jnz 循环中可以从 uop 缓存运行,并在 Skylake (p06) 上以 0.5c 的吞吐量运行,加上循环开销也会竞争 p6。times 20 cdq
对于一个 32 字节的机器代码块,超过 3 个 uop 缓存行,这意味着循环只能从旧版解码运行(循环顶部对齐)。在 Skylake 上,每个 cdq
运行 1 个周期。 .性能计数器确认 MITE 每个周期提供 1 uop,而不是 3 或 4 组,中间有空闲周期。
default rel
%ifdef __YASM_VER__
CPU Skylake AMD
%else
%use smartalign
alignmode p6, 64
%endif
global _start
_start:
mov ebp, 1000000000
align 64
.loop:
;times 10 cdq ; 0.5c throughput
;times 20 cdq ; 1c throughput, 1 MITE uop per cycle front-end
; times 10 cqo ; 0.5c throughput 2-byte insn fits uop cache
; times 10 cdqe ; 1c throughput data dependency
;times 10 cld ; ~4c throughput, 3 uops
dec ebp
jnz .loop
.end:
xor edi,edi
mov eax,231 ; __NR_exit_group from /usr/include/asm/unistd_64.h
syscall ; sys_exit_group(0)
在我的 Arch Linux 桌面上,我将它构建到一个静态可执行文件中以在 perf 下运行:
in a bash shell:
t=cdq-latency; nasm -f elf64 "$t".asm && ld -o "$t" "$t.o" && objdump -drwC -Mintel "$t" && taskset -c 3 perf stat --all-user -etask-clock,context-switches,cpu-migrations,page-faults,cycles,instructions,uops_issued.any,frontend_retired.dsb_miss,idq.dsb_uops,idq.mite_uops,idq.mite_cycles,idq_uops_not_delivered.core,idq_uops_not_delivered.cycles_fe_was_ok,idq.all_mite_cycles_4_uops ./"$t"
拆卸
0000000000401000 <_start>:
401000: bd 00 ca 9a 3b mov ebp,0x3b9aca00
401005: 0f 1f 84 00 00 00 00 00 nop DWORD PTR [rax+rax*1+0x0]
...
40103d: 0f 1f 00 nop DWORD PTR [rax]
0000000000401040 <_start.loop>:
401040: 99 cdq
401041: 99 cdq
401042: 99 cdq
401043: 99 cdq
...
401052: 99 cdq
401053: 99 cdq # 20 total CDQ
401054: ff cd dec ebp
401056: 75 e8 jne 401040 <_start.loop>
0000000000401058 <_start.end>:
401058: 31 ff xor edi,edi
40105a: b8 e7 00 00 00 mov eax,0xe7
40105f: 0f 05 syscall
性能结果:
Performance counter stats for './cdq-latency':
5,205.44 msec task-clock # 1.000 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
1 page-faults # 0.000 K/sec
20,124,711,776 cycles # 3.866 GHz (49.88%)
22,015,118,295 instructions # 1.09 insn per cycle (59.91%)
21,004,212,389 uops_issued.any # 4035.049 M/sec (59.97%)
1,005,872,141 frontend_retired.dsb_miss # 193.235 M/sec (60.03%)
0 idq.dsb_uops # 0.000 K/sec (60.08%)
20,997,157,414 idq.mite_uops # 4033.694 M/sec (60.12%)
19,996,447,738 idq.mite_cycles # 3841.451 M/sec (40.03%)
59,048,559,790 idq_uops_not_delivered.core # 11343.621 M/sec (39.97%)
112,956,733 idq_uops_not_delivered.cycles_fe_was_ok # 21.700 M/sec (39.92%)
209,490 idq.all_mite_cycles_4_uops # 0.040 M/sec (39.88%)
5.206491348 seconds time elapsed
所以循环开销(dec/jnz)基本上是免费发生的,在与最后一个
cdq
相同的循环中解码.计数不准确,因为我在一次运行中使用了太多事件(启用了 HT),所以 perf 进行了软件多路复用。从另一个计数器更少的运行中:
# same source, only these HW counters enabled to avoid multiplexing
5,161.14 msec task-clock # 1.000 CPUs utilized
20,107,065,550 cycles # 3.896 GHz
20,000,134,955 idq.mite_cycles # 3875.142 M/sec
59,050,860,720 idq_uops_not_delivered.core # 11441.447 M/sec
95,968,317 idq_uops_not_delivered.cycles_fe_was_ok # 18.594 M/sec
所以我们可以看到 MITE(传统解码)基本上每个周期都处于事件状态,并且前端基本上从来没有“ok”。 (即永远不会在后端停滞不前)。
...
0000000000401040 <_start.loop>:
401040: 99 cdq
401041: 99 cdq
...
401049: 99 cdq # 10 total CDQ insns
40104a: ff cd dec ebp
40104c: 75 f2 jne 401040 <_start.loop>
Performance counter stats for './cdq-latency' (4 runs):
1,417.38 msec task-clock # 1.000 CPUs utilized ( +- 0.03% )
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
1 page-faults # 0.001 K/sec
5,511,283,047 cycles # 3.888 GHz ( +- 0.03% ) (49.83%)
11,997,247,694 instructions # 2.18 insn per cycle ( +- 0.00% ) (59.99%)
10,999,182,841 uops_issued.any # 7760.224 M/sec ( +- 0.00% ) (60.17%)
197,753 frontend_retired.dsb_miss # 0.140 M/sec ( +- 13.62% ) (60.21%)
10,988,958,908 idq.dsb_uops # 7753.010 M/sec ( +- 0.03% ) (60.21%)
10,234,859 idq.mite_uops # 7.221 M/sec ( +- 27.43% ) (60.21%)
8,114,909 idq.mite_cycles # 5.725 M/sec ( +- 26.11% ) (39.83%)
40,588,332 idq_uops_not_delivered.core # 28.636 M/sec ( +- 21.83% ) (39.79%)
5,502,581,002 idq_uops_not_delivered.cycles_fe_was_ok # 3882.221 M/sec ( +- 0.01% ) (39.79%)
56,223 idq.all_mite_cycles_4_uops # 0.040 M/sec ( +- 3.32% ) (39.79%)
1.417599 +- 0.000489 seconds time elapsed ( +- 0.03% )
据
idq_uops_not_delivered.cycles_fe_was_ok
报道,基本上所有未使用的前端uop插槽都是后端的故障(p0/p6上的端口压力),而不是前端。
关于x86 - 最近英特尔微架构中的简单解码器可以处理所有 1-µop 指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61980149/
令我惊讶的是,dart 没有内置的对象到 json 和 json 到对象的映射器。 我读到我们必须自己手动编写映射代码,这并不令人愉快。 无论如何,虽然我没有针对我的用例对其进行彻底测试,但我发现了
我有 16 位 PCM 音频,我想将其转换为 8 位 PCMU。据我所知,16 位到 8 位的转换很容易 - 只需从每个样本中删除最后 8 位即可。 我想知道如何将8位pcm转换为8位pcmu?任何文
我的任务是使用动态霍夫曼修改 JPEG 格式。所以我试图找到用Java编写的简单Jpeg解码器的源代码。谁能帮我? 最佳答案 看看这个:http://www.dreamincode.net/forum
我收到错误代码(如下),并且无法解码该字符串,我知道它正在查找 JSON 和我也保存的文件,但它无法解析。错误代码: Unexpected token VALUE(-10) at position 8
我制作了这个程序,它是一个随 secret 码。 public class SaadAbdullahCipher { private char[] alphabet = {'a', 'b'
总的来说,我对编程还很陌生,我想知道如何对输入的文本进行编码/解码。 对于 ex A -> D,所有字母必须减去 3 个字母B -> E等等 我将输入一些伪代码作为示例: INPUT MESSAGE:
是否有内置函数或受支持的包中的函数来获取基于输入字符集字符串,例如 ISO-8859-1 或 ISO-8859-15?现在我看到的唯一方法是自己匹配它: func getEncoderForChars
我是新来的。不知何故,我能够理解如何做到这一点。 我在下面做,但它给出了错误 - 无法读取数据,因为它的格式不正确。有人可以帮助我吗?从过去的 4 天开始,我一直坚持这一点。我真的很感激。 impor
就像标题所说,我正在尝试为一个我定义的类的对象编写一个自定义解码器,该对象包含我定义的类的其他对象。 “外部”类是一个 Edge,定义如下: class Edge: def __init__(
我想重新编码音频文件的音频流。以下gstreamer管道可以正常工作: gst-launch-1.0 filesrc location=input.flac ! decodebin ! audioco
使用Swift4、iOS11.1、Xcode9.1, 尝试匹配 Swift4 的可编码结构中的 JSON 文件,我遇到以下问题: 这是我的代码: struct Station: Codable {
正如标题所示,我正在寻找遵循 1.3 版本的 Java(+Android) WBXML 解析器/解码器。如果有必要的话,我什至可以考虑调用 native 代码。谢谢。 最佳答案 我确实记得不久前我使用
当 JABX 解码器尝试解码 xml 时,我遇到以下错误 线程“main”中出现异常 javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.S
我正在处理不同尺寸(x,y)的图像。当在 MaxPooling2D 之后使用 UpSampling2D 时,它不能很好地重建它,因为 x-dim 不等于 y-dim。当 x=y (例如 28x28)时
http://www.lotterypost.com/js-compress.aspx 这个网站非常适合压缩 JS 但我想解码.... 除了在线之外,有没有最好的免费工具来编码/解码 Js 最佳答案
我刚刚在验证 JWT 时遇到了问题。我正在运行的代码是一个相当肮脏的黑客,它采用 JWT 的第二个组件并通过 Base64 解码器运行它。然而事实证明,通过一些 super 特殊的 JWT,我得到了一
我正在尝试使用 CUDA 解码器项目中的代码将解码后的图像文件保存回 BMP 图像。 if (g_bReadback && g_ReadbackSID)
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
在自己尝试 URL 解码之后,我设法想出了一些可行的想法 - 但它们不是很有效。由于 URL 解码是我的程序中可能出现严重瓶颈的地方,我决定上网寻找更有效的解决方案。我遇到了这篇 codeguru 文
是否可以“拦截” JAXB 的解码过程? 我有一个 xml 响应,部分应该转换为不同的 java 字段结构: ... 在我的 java 类中,我更愿意将其解码为 List ,
我是一名优秀的程序员,十分优秀!