簡體   English   中英

如何計算在Red Hat Enterprise Linux(x86-64)上執行的指令?

[英]How can I count instructions executed on Red Hat Enterprise Linux (x86-64)?

我想知道在Red Hat Enterprise Linux上運行的程序的給定運行期間執行了多少x86-64指令。 我知道我可以從valgrind那里得到這些信息,但是減速是相當可觀的。 我也知道我們使用的是內置硬件性能計數器的Intel Core 2 Quad CPU(型號Q6700)。但我不知道有什么方法可以訪問C程序中執行的指令總數。

libpapi是您正在尋找的圖書館。 AMD和英特爾芯片提供insn計數。

性能應用程序編程接口(PAPI)似乎與您正在尋找的一致。

來自網站

PAPI旨在為工具設計人員和應用工程師提供一致的接口和方法,以便使用大多數主要微處理器中的性能計數器硬件。

Vince Weaver是田納西大學創新計算實驗室的博士后研究員,他做了一些與PAPI相關的工作。 他在UTK 網頁上列出的研究表明它可能會提供一些額外的信息。

根據您的需要,有幾種方法可以解決它。 如果你只是想找出潛在參數的總數,你可以在二進制文件上運行objdump,這將為你提供程序集。 如果您想了解有關程序的給定運行中遇到的實際指令的更多詳細信息,您可能需要查看提供該功能的DynamoRIO 它類似於valgrind,但我相信它對性能的影響較小。 我能夠相對快速,輕松地將9月份的基本指令計數器放在一起。

如果這不好,您可以嘗試檢查PAPI ,這是一個API,可以讓您獲得處理器上的性能計數器。 我從來沒有用它,所以我不能說話,但是我的一個朋友在大約6個月前的一個項目中使用它,並說他發現它非常有幫助。

下面的程序從C訪問循環計數器寄存器(抱歉非便攜式代碼,但與gcc一起工作正常)。 這個用於計算周期,這與指令不同。 現代處理器既可以在同一條指令上使用多個周期,也可以一次執行多條指令。 循環通常更多地用於指令的數量,但這取決於你的實際目的。

其他性能計數器當然可以以相同的方式訪問(實​​際上我甚至不知道是否有其他的),但我將不得不尋找使用的實際指令代碼。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM