2010-11-17 56 views
6

我想知道在Red Hat Enterprise Linux上运行的程序的特定运行过程中执行了多少个x86-64指令。我知道我可以从valgrind得到这些信息,但是放缓相当可观。我也知道我们使用的是内置硬件性能计数器的英特尔酷睿2四核CPU(型号Q6700),但我不知道有什么方法可以访问从C程序内执行的指令总数。如何计算在红帽企业Linux(x86-64)上执行的指令?

+0

只是想知道。你为什么想要执行一些指令?周期数看起来更加有意义,即添加速度缓慢的指令(比如内存访问)和快速寄存器绑定指令。 – kriss 2010-11-17 03:06:10

+0

周期数包括停顿,例如等待从缓存传递的数据。所以它不同于跑步,而insns的数量保持不变 – horsh 2010-11-17 03:15:28

+0

@kriss:什么说什么 - 我正在寻找一个稳定和可重复的数字。 – 2010-11-17 05:48:02

回答

2

Performance Application Programming Interface (PAPI)似乎是一起的,你在找什么线路。

website

PAPI旨在提供工具设计者和应用工程师以统一的界面和方法用在最重要的微处理器中发现的性能计数器的硬件。

Vince Weaver是田纳西大学创新计算实验室的博士后研究员,做了一些PAPI-related的工作。他在UTK的web page上列出的研究看起来可能会提供一些额外的信息。

2

libpapi是您正在寻找的图书馆。 AMD和英特尔芯片提供insn计数。

1

有几种方法可以解决这个问题,具体取决于你需要什么。如果你只想找出潜在参数的总数,你可以在二进制文件上运行objdump,这会给你装配。如果您想要了解在该程序的特定运行中遇到的实际指令的更多详细信息,您可能需要查看提供该功能的DynamoRIO。它与valgrind类似,但我相信它对性能的影响较小。我能够比较快速和容易地在9月份将基本指令计数器放在一起。

如果这样做不好,您可以尝试检查PAPI,这是一个API,它可以让您获得处理器上的性能计数器。我从来没有用过它,所以我不能说话,但我的一位朋友在大约6个月前的一个项目中使用了它,并表示他发现它非常有帮助。

1

下面的程序访问循环计数器寄存器C(对不起,不可移植的代码,但与gcc工作正常)。这是用于计算周期的,这与指令不一样。现代处理器既可以在同一条指令上使用几个周期,也可以一次执行多条指令。周期通常更多地介入该指令的数量,但这取决于您的实际目的。

其他演出计数器当然可以以相同的方式访问(实​​际上我甚至不知道是否有其他演出计数器),但我将不得不寻找实际的指令代码来使用。

static __inline__ unsigned long long rdtsc(void) 
{ 
    unsigned long long int x; 
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 
    return x; 

}

相关问题