C++ 确定一个代码块需要多少时钟周期
有没有一种工具或方法可以告诉我一个代码块使用了多少时钟周期? 手工调试和计数对于庞大的代码块来说是一件痛苦的事情。在x86上,它是我所知道的唯一的静态分析器。它假定零缓存未命中和其他各种简化,但有些有用 我认为它还假设除了最后一个分支之外,其他所有分支都没有被执行,因此对于具有执行的分支的循环体来说,它可能没有用处 IACA在其数据中也有一些错误,例如,它认为C++ 确定一个代码块需要多少时钟周期,c++,performance,optimization,cpu,performance-testing,x86,C++,Performance,Optimization,Cpu,Performance Testing,X86,有没有一种工具或方法可以告诉我一个代码块使用了多少时钟周期? 手工调试和计数对于庞大的代码块来说是一件痛苦的事情。在x86上,它是我所知道的唯一的静态分析器。它假定零缓存未命中和其他各种简化,但有些有用 我认为它还假设除了最后一个分支之外,其他所有分支都没有被执行,因此对于具有执行的分支的循环体来说,它可能没有用处 IACA在其数据中也有一些错误,例如,它认为shld在Sandybridge上速度较慢。它确实知道一些不明显的事情,比如 自从Haswell的更新后,它基本上被放弃了。Skylake
shld
在Sandybridge上速度较慢。它确实知道一些不明显的事情,比如
自从Haswell的更新后,它基本上被放弃了。Skylake可以在比Haswell更多的执行端口上运行一些指令(请参阅),但管道非常相似,因此结果应该相当有用。另请参见tag wiki上的其他链接,包括Intel的优化手册,以帮助您理解输出
我喜欢使用这个
iaca.sh
包装脚本将-64
设置为默认值(我可以用-32
覆盖)。我忘了我写了多少(可能只是结尾的if($#>=1))
位)以及LD#u LIBRARY_PATH部分的来源
iaca.sh
:
#!/bin/bash
myname=$(realpath "$0")
mypath=$(dirname "$myname")
ld_lib="$LD_LIBRARY_PATH"
app_loc="../lib"
if [ "$LD_LIBRARY_PATH" = "" ]
then
export LD_LIBRARY_PATH="$mypath/$app_loc"
else
export LD_LIBRARY_PATH="$mypath/$app_loc:$LD_LIBRARY_PATH"
fi
if (($# >= 1));then
exec "$mypath/iaca" -64 "$@"
else
exec "$mypath/iaca" # there is no -help, just run with no args for help output
fi
示例:就地前缀和,来自: 请注意,总uop计数不是与前端、ROB和4-wide发行/退役宽度相关的融合域uop。它统计未使用的域UOP,这对执行单元(和调度程序)很重要。不过这有点傻,因为在未使用的域中,uop需要哪个端口最重要,而不是有多少端口 这不是最好的例子,因为它在Haswell的shuffle端口上有点瓶颈。它确实显示了IACA如何显示mov消除、微融合存储和宏融合比较和分支 当有选择时,UOP在端口之间的分布相当随意。不要期望它能与真正的硬件相匹配。我认为IACA根本没有为ROB/调度程序建模,真的。这一限制和其他限制已在之前的SO问题中讨论过。尝试在IACA上搜索,因为它是一个相当独特的字符串。在x86上,它是我所知道的唯一静态分析器。它假定零缓存未命中和其他各种简化,但有些有用 我认为它还假设除了最后一个分支之外,其他所有分支都没有被执行,因此对于具有执行的分支的循环体来说,它可能没有用处 IACA在其数据中也有一些错误,例如,它认为
shld
在Sandybridge上速度较慢。它确实知道一些不明显的事情,比如
自从Haswell的更新后,它基本上被放弃了。Skylake可以在比Haswell更多的执行端口上运行一些指令(请参阅),但管道非常相似,因此结果应该相当有用。另请参见tag wiki上的其他链接,包括Intel的优化手册,以帮助您理解输出
我喜欢使用这个
iaca.sh
包装脚本将-64
设置为默认值(我可以用-32
覆盖)。我忘了我写了多少(可能只是结尾的if($#>=1))
位)以及LD#u LIBRARY_PATH部分的来源
iaca.sh
:
#!/bin/bash
myname=$(realpath "$0")
mypath=$(dirname "$myname")
ld_lib="$LD_LIBRARY_PATH"
app_loc="../lib"
if [ "$LD_LIBRARY_PATH" = "" ]
then
export LD_LIBRARY_PATH="$mypath/$app_loc"
else
export LD_LIBRARY_PATH="$mypath/$app_loc:$LD_LIBRARY_PATH"
fi
if (($# >= 1));then
exec "$mypath/iaca" -64 "$@"
else
exec "$mypath/iaca" # there is no -help, just run with no args for help output
fi
示例:就地前缀和,来自: 请注意,总uop计数不是与前端、ROB和4-wide发行/退役宽度相关的融合域uop。它统计未使用的域UOP,这对执行单元(和调度程序)很重要。不过这有点傻,因为在未使用的域中,uop需要哪个端口最重要,而不是有多少端口 这不是最好的例子,因为它在Haswell的shuffle端口上有点瓶颈。它确实显示了IACA如何显示mov消除、微融合存储和宏融合比较和分支 当有选择时,UOP在端口之间的分布相当随意。不要期望它能与真正的硬件相匹配。我认为IACA根本没有为ROB/调度程序建模,真的。这一限制和其他限制已在之前的SO问题中讨论过。尝试搜索IACA,因为它是一个非常独特的字符串。在现代处理器(如现代x86)上,这通常不是一个有意义/有用的统计数据(由于无序执行、内存暂停、指令缓存、分支预测等),在现代处理器(如现代x86)上,这通常不是一个有意义/有用的统计数据(由于无序执行、内存暂停、指令缓存、分支预测等)
$ gcc -I/opt/iaca-2.1/include -Wall -O3 -c prefix-sum.c -march=nehalem -mtune=haswell
$ iaca.sh prefix-sum.o
Intel(R) Architecture Code Analyzer Version - 2.1
Analyzed File - prefix-sum.o
Binary Format - 64Bit
Architecture - HSW
Analysis Type - Throughput
Throughput Analysis Report
--------------------------
Block Throughput: 6.40 Cycles Throughput Bottleneck: Port5
Port Binding In Cycles Per Iteration:
---------------------------------------------------------------------------------------
| Port | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 |
---------------------------------------------------------------------------------------
| Cycles | 1.0 0.0 | 5.7 | 1.4 1.0 | 1.4 1.0 | 2.0 | 6.3 | 1.0 | 1.3 |
---------------------------------------------------------------------------------------
N - port number or number of cycles resource conflict caused delay, DV - Divider pipe (on port 0)
D - Data fetch pipe (on ports 2 and 3), CP - on a critical path
F - Macro Fusion with the previous instruction occurred
* - instruction micro-ops not bound to a port
^ - Micro Fusion happened
# - ESP Tracking sync uop was issued
@ - SSE instruction followed an AVX256 instruction, dozens of cycles penalty is expected
! - instruction not supported, was not accounted in Analysis
| Num Of | Ports pressure in cycles | |
| Uops | 0 - DV | 1 | 2 - D | 3 - D | 4 | 5 | 6 | 7 | |
---------------------------------------------------------------------------------
| 1 | | | 1.0 1.0 | | | | | | | movdqa xmm3, xmmword ptr [rax]
| 1 | 1.0 | | | | | | | | | add rax, 0x20
| 1 | | | | 1.0 1.0 | | | | | | movdqa xmm0, xmmword ptr [rax-0x10]
| 0* | | | | | | | | | | movdqa xmm1, xmm3
| 1 | | | | | | 1.0 | | | CP | pslldq xmm1, 0x4
| 1 | | 1.0 | | | | | | | | paddd xmm1, xmm3
| 0* | | | | | | | | | | movdqa xmm3, xmm0
| 1 | | | | | | 1.0 | | | CP | pslldq xmm3, 0x4
| 0* | | | | | | | | | | movdqa xmm4, xmm1
| 1 | | 1.0 | | | | | | | | paddd xmm3, xmm0
| 1 | | | | | | 1.0 | | | CP | pslldq xmm4, 0x8
| 0* | | | | | | | | | | movdqa xmm0, xmm3
| 1 | | 1.0 | | | | | | | | paddd xmm1, xmm4
| 1 | | | | | | 1.0 | | | CP | pslldq xmm0, 0x8
| 1 | | 1.0 | | | | | | | | paddd xmm1, xmm2
| 1 | | 0.8 | | | | 0.2 | | | CP | paddd xmm0, xmm3
| 2^ | | | | | 1.0 | | | 1.0 | | movaps xmmword ptr [rax-0x20], xmm1
| 1 | | | | | | 1.0 | | | CP | pshufd xmm1, xmm1, 0xff
| 1 | | 0.9 | | | | 0.1 | | | CP | paddd xmm0, xmm1
| 2^ | | | 0.3 | 0.3 | 1.0 | | | 0.3 | | movaps xmmword ptr [rax-0x10], xmm0
| 1 | | | | | | 1.0 | | | CP | pshufd xmm1, xmm0, 0xff
| 0* | | | | | | | | | | movdqa xmm2, xmm1
| 1 | | | | | | | 1.0 | | | cmp rdx, rax
| 0F | | | | | | | | | | jnb 0xffffffffffffff94
Total Num Of Uops: 20