2010-11-17 55 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; 

}

相關問題