- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Haswell和更早版本上的ADC通常为2 uops,具有2个周期的延迟,因为Intel uops传统上只能有2个输入(https://agner.org/optimize/)。在某些情况下,Haswell为FMA和micro-fusion of indexed addressing modes引入了3输入uops之后,Broadwell/Skylake和后来的版本具有单uup ADC/SBB/CMOV。
(但是BDW/SKL仍然对adc al, imm8
短格式编码使用2 uops,或者对其他al/ax/eax/rax,imm8/16/32/32短格式使用无ModRM。我的答案中有更多细节。)
但是在Haswell上,立即数为0的 adc
是特殊情况,只能解码为单个uop。 @BeeOnRope tested this,并在其uarch-bench中包括对此performance quirk的检查:https://github.com/travisdowns/uarch-bench。 Haswell服务器上CI的示例输出显示了adc reg,0
和adc reg,1
或adc reg,zeroed-reg
之间的差异。
(但仅适用于32或64位操作数大小,而不适用于adc bl,0
。因此,请使用32位when using adc on a setcc result将2个条件组合到一个分支中。)
与SBB相同。据我所知,对于具有相同立即值的等效编码,在任何CPU上ADC和SBB的性能之间都没有任何区别。
何时引入了针对imm=0
的优化?
我在Core 21上进行了测试,发现adc eax,0
延迟为2个周期,与adc eax,3
相同。而且,对于0
和3
的吞吐量测试的一些变体,周期数是相同的,因此第一代Core 2(Conroe/Merom)不进行此优化。
回答此问题的最简单方法可能是在Sandybridge系统上使用下面的测试程序,并查看adc eax,0
是否比adc eax,1
更快。但是基于可靠文档的答案也可以。
脚注1 :我在运行Linux的Core 2 E6600(Conroe/Merom)上使用了此测试程序。
;; NASM / YASM
;; assemble / link this into a 32 or 64-bit static executable.
global _start
_start:
mov ebp, 100000000
align 32
.loop:
xor ebx,ebx ; avoid partial-flag stall but don't break the eax dependency
%rep 5
adc eax, 0 ; should decode in a 2+1+1+1 pattern
add eax, 0
add eax, 0
add eax, 0
%endrep
dec ebp ; I could have just used SUB here to avoid a partial-flag stall
jg .loop
%ifidn __OUTPUT_FORMAT__, elf32
;; 32-bit sys_exit would work in 64-bit executables on most systems, but not all. Some, notably Window's subsystem for Linux, disable IA32 compat
mov eax,1
xor ebx,ebx
int 0x80 ; sys_exit(0) 32-bit ABI
%else
xor edi,edi
mov eax,231 ; __NR_exit_group from /usr/include/asm/unistd_64.h
syscall ; sys_exit_group(0)
%endif
perf
在像Core 2这样的旧CPU上不能很好地工作(它不知道如何访问诸如uops之类的所有事件),但是它确实知道如何读取HW计数器的周期和指令。足够了。
yasm -felf64 -gdwarf2 testloop.asm
ld -o testloop-adc+3xadd-eax,imm=0 testloop.o
# optional: taskset pins it to core 1 to avoid CPU migrations
taskset -c 1 perf stat -e task-clock,context-switches,cycles,instructions ./testloop-adc+3xadd-eax,imm=0
Performance counter stats for './testloop-adc+3xadd-eax,imm=0':
1061.697759 task-clock (msec) # 0.992 CPUs utilized
100 context-switches # 0.094 K/sec
2,545,252,377 cycles # 2.397 GHz
2,301,845,298 instructions # 0.90 insns per cycle
1.069743469 seconds time elapsed
adc
进行静态分析的期望:循环中的
(5*(1+3) + 3) = 23
指令,延迟的
5*(2+3) = 25
周期=每个循环迭代的周期。 23/25 = 0.92。
(5*(1+3) + 3) / (5*(1+3)) = 1.15
,即额外的.15来自xor-zero和dec/jg,而adc/add链正好以每个时钟1 uop的速度运行,这使延迟成为瓶颈。我们也希望其他任何具有单周期等待时间
adc
的uarch上的总体IPC为1.15,因为前端不是瓶颈。 (按顺序排列的Atom和P5 Pentium会稍低一些,但是xor和dec可以与adc配对或在P5上添加。)
uops_issued.any
=
instructions
= 2.303G,确认
adc
是单个uop(无论立即数具有什么值,它始终在SKL上)。偶然地,
jg
是新缓存行中的第一条指令,因此它不会与SKL上的
dec
宏融合。使用
dec rbp
或
sub ebp,1
代替,
uops_issued.any
是预期的2.2G。
perf stat -r5
(运行5次并显示平均值+方差),并且多次运行,表明循环计数可重复至1000的1倍。
adc
中的1c与2c延迟会产生更大的差异比起那个来说。
0
以外的立即数重建可执行文件根本不会改变Core 2上的时间,这是一个没有特殊情况的有力信号。绝对值得测试。
xor eax,eax
,让OoO exec重叠迭代),但是很难排除前端效果。我认为我终于通过添加单联
add
指令避免了前端瓶颈。内部循环的吞吐量测试版本如下所示:
xor eax,eax ; break the eax and CF dependency
%rep 5
adc eax, 0 ; should decode in a 2+1+1+1 pattern
add ebx, 0
add ecx, 0
add edx, 0
%endrep
adc
是前端的多uop瓶颈。我想我可以使用
times 5 adc eax, 0
来实现这一点,因为管道的某些后期阶段不太可能能够在不执行该uop的情况下抛出该uop。
最佳答案
根据我的微基准测试,其结果可以在uops.info上找到,此优化是由Sandy Bridge(http://uops.info/html-tp/SNB/ADC_R64_I8-Measurements.html)引入的。 Westmere不执行此优化(http://uops.info/html-tp/WSM/ADC_R64_I8-Measurements.html)。数据是使用Core i7-2600和Core i5-650获得的。
此外,uops.info上的数据显示,如果使用8位寄存器(Sandy Bridge,Ivy Bridge,Haswell),则不会执行优化。
关于performance - 哪个英特尔微体系结构引入了ADC reg,0单uop特殊情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51664369/
我尝试设置一个文件来使用 PyCharm 编写 AI。 我正在使用的教程:https://www.youtube.com/watch?v=ujTCoH21GlA 当我运行代码时: $ import t
我一直在寻找很长一段时间,似乎无法找到一个官方/结论性的数字来引用英特尔至强四核可以完成的单精度浮点运算/时钟周期的数量。我有一个 Intel Xeon 四核 E5530 CPU。 我希望用它来计算我
在深度学习与神经网络领域,研究人员通常离不开 GPU。得益于 GPU 极高内存带宽和较多核心数,研究人员可以更快地获得模型训练的结果。与此同时,CPU 受限于自身较少的核心数,计算运行需要较长的时间
我试图了解 TCS 启用的 SGX 线程与 SDK 提供的不受信任线程之间的区别. 如果我理解正确的话,TCS 允许多个逻辑处理器进入同一个飞地。每个逻辑处理器都有自己的 TCS,因此也有自己的入口点
我想通过 IACA 分析器运行一些代码以查看它使用了多少个 uops——我从一个简单的函数开始,看看它是否在工作。 不幸的是,当我插入 IACA 说要使用的宏时,生成的程序集非常不同,因此对它的任何分
是否有可能获得许可的开发人员证书,以在生产模式下签署经过安全审查、社区开发的开源 SGX 软件二进制文件,并将其发布在 apt 或 rpm 等开源存储库中? 我刚问过英特尔 SGX 团队,他们说只有经
我正在尝试模拟 Intel 8080 指令集,但我被这条指令卡住了 OUT D8 ,根据书Intel 8080/8085 Assembly Language Programming它说 OUT ins
我在使用一些现有的 FORTRAN 代码时发现了一个问题。尽管它已经预料到需要在重新分配之前释放数组,但这从来没有必要。我现在需要它来执行此操作,但它无法正常运行。 当前的伪代码大约是: MODULE
我正在尝试在内存中对齐以下类型的数据: type foo real, allocatable, dimension(:) :: bar1, bar2 !dir$ attributes al
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
似乎获得和释放语义的公认定义是这样的: (引自 http://msdn.microsoft.com/en-us/library/windows/hardware/ff540496(v=vs.85).a
这是我对英特尔 TBB 流图性能进行基准测试的尝试。这是设置: 一个广播节点发送continue_msg到 N 后继节点 (一broadcast_node) 每个后继节点执行一次计算,该计算需要 t
我有两个问题 第一个问题:我使用 css3、HTML5、JavaScript 开发应用程序。在我的应用程序中,我需要从数据库中获取数据。我该怎么做? 第二个问题:intel xdk 在构建 l 时必须
在英特尔手册的第 3 卷中,它包含硬件事件计数器的描述: BACLEAR_FORCE_IQ Counts number of times a BACLEAR was forced by the Ins
嘿,我正在使用 Intel xdk 开发混合应用程序。我已经创建了注册表,然后我将代码放在那里。我尝试使用 Php Mysql 将数据库插入我的数据库后。 如果我单击注册按钮,它会显示这样的错误 [
我想知道是否可以让英特尔 C++ 编译器(或其他编译器,如 gcc 或 clang)显示一些来自优化器的消息。我想知道优化器究竟对我的代码做了什么。默认情况下,编译器只打印非常基本的东西,比如未使用的
我正在使用 64 位架构的 Intel 程序集优化我的视频解码器。为了优化,我使用 AVX2 指令集。 我的开发环境:- 操作系统:- Win 7(64位) IDE:- MSVS 2008(教授) C
如果这是一个非常愚蠢的问题,我很抱歉;我的 Fortran 不太好。我正在移植一些旧的 Fortran 代码,并遇到了这个子例程定义: SUBROUTINE SET_HYDROMODULE(HYDRO
请问,我是否可以将 Intel XDK API 和 Phonegap API 集成到单个移动应用程序中?这是因为,某些 API 仅在 Phonegap 中可用,反之亦然。 最佳答案 是的,如果我正确理
在 x86 中查找任意操作码的含义(例如 0xC8 )的相对快速简便的方法是什么? Intel Software Developer's manual搜索起来不是很有趣...... 最佳答案 查询 t
我是一名优秀的程序员,十分优秀!