Performance 基准测试-如何计算发送到CPU的指令数以查找已使用的MIP

Performance 基准测试-如何计算发送到CPU的指令数以查找已使用的MIP,performance,assembly,profiling,cpu,benchmarking,Performance,Assembly,Profiling,Cpu,Benchmarking,假设我有一个软件,想用一种方法研究它的行为。我有一个3.0GHz的CPU,有2个插槽和4个内核。如您所知,为了找出每秒指令数(IPS),我们必须使用以下公式: IPS = sockets*(cores/sockets)*clock*(instructions/cycle) 首先,我想为我的特定算法找到每个周期的指令数。然后,我意识到用块盒方法计算它几乎是不可能的,我需要对算法进行深入分析 但现在,我有两个问题:不管我的机器上运行的是哪种软件及其cpu使用情况,有没有办法计算每秒发送到cpu的指

假设我有一个软件,想用一种方法研究它的行为。我有一个3.0GHz的CPU,有2个插槽和4个内核。如您所知,为了找出每秒指令数(IPS),我们必须使用以下公式:

IPS = sockets*(cores/sockets)*clock*(instructions/cycle)
首先,我想为我的特定算法找到每个周期的指令数。然后,我意识到用块盒方法计算它几乎是不可能的,我需要对算法进行深入分析

但现在,我有两个问题:不管我的机器上运行的是哪种软件及其cpu使用情况,有没有办法计算每秒发送到cpu的指令数(每秒数百万条指令(MIPS))?是否有可能找到指令集的类型(添加、比较、输入、跳转等)

任何脚本或工具建议(任何语言)都将受到欢迎。

perf stat——Linux上的所有用户/my_程序将使用CPU性能计数器记录它运行了多少用户空间指令,以及占用了多少核心时钟周期。它使用了多少CPU时间,并将为您计算每个核心时钟周期的平均指令,例如

3,496,129,612      instructions:u            #    2.61  insn per cycle
它为你计算IPC;这通常比每秒指令数更有趣<代码>uops
每个时钟通常更有趣,因为您离最大化前端的距离有多近您可以根据
指令和
任务时钟手动计算MIPS
对于大多数其他事件,perf以每秒的速率打印注释

(如果不使用
--all user
,则可以使用
perf stat-e task clock:u,instructions:u
,…使这些特定事件仅在用户空间中计数,而其他事件可以始终计数,包括内部中断处理程序和系统调用。)

但是,如果您确实需要整个内核的总MIP或平均MIP,以及是否计算睡眠,请参阅有关
指令/任务时钟
指令/已用时间
的更多详细信息


有关在静态可执行文件中的微小微基准循环上使用它的输出示例,请参阅

如何在运行时获取实时信息


你的意思是从程序内部,只分析其中的一部分吗?有一个perf API,您可以在其中执行
perf\u event\u open
或其他操作。或者使用其他库直接访问硬件性能计数器

perf stat
非常适合微基准标记一个循环,该循环已被隔离到一个只运行热循环一秒钟左右的独立程序中

或者你是说别的什么
性能统计-I 1000/a、 out
将每1000毫秒(1秒)打印一次计数器值,以查看程序行为如何在您想要的任何时间窗口(最短为10毫秒的间隔)内实时改变

sudo perf top
是系统范围的,有点像Unix
top

还有
perf record--timestamp
来记录每个事件样本的时间戳<代码>性能报告-D
可能与此一起使用。看,他提到了一些关于
-T
-timestamp
)。我真的没有用过这个;我主要将我正在调优的单个循环隔离到一个静态可执行文件中,我可以在
perf stat
下运行


是否有可能找到指令集的类型(添加、比较、输入、跳转等)

英特尔x86 CPU至少有一个用于分支指令的计数器,但除FP指令外,其他类型没有区别。这可能是大多数具有perf计数器的体系结构所共有的

对于Intel CPU,有一个用于
perf
的包装器,带有更多微体系结构事件的符号名称。(更新:普通
perf
现在知道大多数uarch特定计数器的名称,因此您不再需要
ocperf.py

perf stat-e task\u时钟、周期、指令、浮点运算指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令指令

它不是用来告诉您正在运行什么指令的,您已经可以通过跟踪执行来告诉您。大多数指令都是完全管道化的,所以有趣的是哪个端口的压力最大。除法/sqrt单元是个例外:有一个计数器用于
算术。除法器处于活动状态
:“当除法单元忙于执行除法或平方根运算时循环。用于整数和浮点运算”。分隔器没有完全管道化,因此新的
divps
sqrtps
不能总是启动,即使没有旧的UOP准备在端口0上执行。()

相关:用于使用
perf
识别热点。特别是使用自顶向下的评测,您可以对调用堆栈进行采样,以查看哪些函数会进行大量昂贵的子调用。(我提到这一点是为了防止您真正想知道的,而不是指令混合。)

相关:


对于精确的动态指令计数,如果您使用的是x86,则可以使用英特尔引脚之类的检测工具

perf stat
指令的计数:u
硬件甚至应该或多或少精确,并且在实践中,在执行相同工作的同一程序的运行中非常可重复

在最新的Intel CPU上,硬件支持记录条件/间接分支的运行方式,因此,假设没有自修改代码,并且您仍然可以读取任何JIT缓冲区,您可以准确地重建以何种顺序运行的指令



抱歉,我不知道AMD CPU上的等价物是什么。

perf stat./my_程序在Linux上将使用CPU性能计数器记录它运行了多少条指令,以及我运行了多少个核心时钟周期