Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定一个代码块需要多少时钟周期_C++_Performance_Optimization_Cpu_Performance Testing_X86 - Fatal编程技术网

C++ 确定一个代码块需要多少时钟周期

C++ 确定一个代码块需要多少时钟周期,c++,performance,optimization,cpu,performance-testing,x86,C++,Performance,Optimization,Cpu,Performance Testing,X86,有没有一种工具或方法可以告诉我一个代码块使用了多少时钟周期? 手工调试和计数对于庞大的代码块来说是一件痛苦的事情。在x86上,它是我所知道的唯一的静态分析器。它假定零缓存未命中和其他各种简化,但有些有用 我认为它还假设除了最后一个分支之外,其他所有分支都没有被执行,因此对于具有执行的分支的循环体来说,它可能没有用处 IACA在其数据中也有一些错误,例如,它认为shld在Sandybridge上速度较慢。它确实知道一些不明显的事情,比如 自从Haswell的更新后,它基本上被放弃了。Skylake

有没有一种工具或方法可以告诉我一个代码块使用了多少时钟周期? 手工调试和计数对于庞大的代码块来说是一件痛苦的事情。

在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上,它是我所知道的唯一静态分析器。它假定零缓存未命中和其他各种简化,但有些有用

我认为它还假设除了最后一个分支之外,其他所有分支都没有被执行,因此对于具有执行的分支的循环体来说,它可能没有用处

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