如何计算在红帽企业Linux(x86-64)上执行的指令?
问题描述:
我想知道在Red Hat Enterprise Linux上运行的程序的特定运行过程中执行了多少个x86-64指令。我知道我可以从valgrind得到这些信息,但是放缓相当可观。我也知道我们使用的是内置硬件性能计数器的英特尔酷睿2四核CPU(型号Q6700),但我不知道有什么方法可以访问从C程序内执行的指令总数。如何计算在红帽企业Linux(x86-64)上执行的指令?
答
Performance Application Programming Interface (PAPI)似乎是一起的,你在找什么线路。
从website:
PAPI旨在提供工具设计者和应用工程师以统一的界面和方法用在最重要的微处理器中发现的性能计数器的硬件。
Vince Weaver是田纳西大学创新计算实验室的博士后研究员,做了一些PAPI-related的工作。他在UTK的web page上列出的研究看起来可能会提供一些额外的信息。
答
下面的程序访问循环计数器寄存器C(对不起,不可移植的代码,但与gcc工作正常)。这是用于计算周期的,这与指令不一样。现代处理器既可以在同一条指令上使用几个周期,也可以一次执行多条指令。周期通常更多地介入该指令的数量,但这取决于您的实际目的。
其他演出计数器当然可以以相同的方式访问(实际上我甚至不知道是否有其他演出计数器),但我将不得不寻找实际的指令代码来使用。
static __inline__ unsigned long long rdtsc(void)
{
unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
只是想知道。你为什么想要执行一些指令?周期数看起来更加有意义,即添加速度缓慢的指令(比如内存访问)和快速寄存器绑定指令。 – kriss 2010-11-17 03:06:10
周期数包括停顿,例如等待从缓存传递的数据。所以它不同于跑步,而insns的数量保持不变 – horsh 2010-11-17 03:15:28
@kriss:什么说什么 - 我正在寻找一个稳定和可重复的数字。 – 2010-11-17 05:48:02