2016-11-06 240 views
7

對於我的項目我必須使用內聯彙編指令(如rdtsc)來計算某些C/C++指令的執行時間。ARM中是否存在對rdtsc的等效指令?

下面的代碼似乎對英特爾但不能在ARM處理器上運行:

{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);} 
//The C++ statement to measure its execution time 
{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);} 
time = t1-t0; 

我的問題是:

怎麼寫類似於上面的內聯彙編代碼(以計算指令的執行已用時間)以在ARM處理器上工作?

+2

多核處理器上的'rdtsc'可能有問題。請參閱https://msdn.microsoft.com/en-us/library/ee417693(VS.85).aspx –

+0

單指令將具有基於緩存等可變計時。更好地循環數千次,它/他們並使用perf_events()通用功能,使其可以在所有支持的CPU上工作。 – BitBank

回答

6

您應該閱讀協處理器p15(不是實際的協處理器,只是CPU功能的入口點)的PMCCNTR寄存器以獲取週期數。請注意,它是提供給無特權的應用程序,僅當:

  1. 非特權PMCCNTR讀取的alowed:

    位0的PMUSERENR寄存器必須設置爲1(official docs

  2. PMCCNTR實際上是計數週期:

    PMCNTENSET位31必須設置爲1(official docs

這是a real-world example它是如何完成的。

+0

@Curious請注意,以上答案適用於ARMv6及更高版本。較早的拱形版本可能有自己的獲取這些數據的方法(特定於某個特定芯片 - 因此該信息可在芯片的數據表中找到),而一些基於ARM的芯片根本不提供這些數據。 –

+0

**我的ARM CPU是ARM7A **,但是通過使用編譯器宏_ARM_ARCH_7A__確認,當我嘗試使用指令asm volatile(「mrc p15,0,**%0 **,c9,c13,0」 :「= r」(pmccntr));編譯器給出錯誤信息:Error「no such instruction」asm volatile(「mrc p15,0,**%eax **,c9,c13,0」:「= r 「(pmccntr)); – Curious

+0

**我生成環境= ** PLATFORM_VERSION_CODENAME = REL PLATFORM_VERSION = 4.3 TARGET_PRODUCT = full_manta TARGET_BUILD_VARIANT =主機 TARGET_BUILD_TYPE =釋放 TARGET_BUILD_APPS = TARGET_ARCH =手臂 TARGET_ARCH_VARIANT = ARMv7的-A-氖 TARGET_CPU_VARIANT =皮質-A15 HOST_ARCH = 86 HOST_OS = Linux的 HOST_OS_EXTRA = Linux的3.16.0-70泛型-x86_64的與 - Ubuntu的14.04,值得信賴的 HOST_BUILD_TYPE =釋放 BUILD_ID = JWR66V OUT_DIR =出 – Curious