2017-10-09 130 views
0

正如我們在x2APIC中所知,我們使用MSR而不是由xAPIC使用的MMIO。 但根據我的測試,我發現MSR訪問的速度比MMIO慢得多。x2APIC中的MSR性能

例如,在我的環境我寫了下面一個簡單的測試用例:

static __inline__ void __loApicWrite 
(
UINT32 * addr, 
UINT32  value 
) 
{ 
__asm__ volatile 
    (
    "movl %1, %0" 
    : "=m" (*(addr)) 
    : "ir" (value) 
    ); 
} 

void MSR_vs_MMIO(int way) 
{ 
unsigned long a; 
unsigned long b; 
int i = 0; 

msrReg = MSR_BASE_ADDRESS + (LOAPIC_ESR >> 4); 

if (way == 0) /*MSR*/ 
    { 
    for (i = 0; i < 1000; i++) 
     { 
     a = pentiumTscGet();  

     __asm__ volatile 
     (
     "wrmsr\n" 
     : : "c" (msrReg), "a"(0), "d" (0) 
     ); 

     b = pentiumTscGet(); 

     if (b > a) 
      benchmark_record[i] = b - a ; 
     } 
    } 

else   /*MMIO*/ 
    { 
    for (i = 0; i < 1000; i++) 
     { 
     a = pentiumTscGet(); 

     __loApicWrite((UINT32 *)((0x82244000) + LOAPIC_ESR), 0); 
     b = pentiumTscGet(); 

     if (b > a) 
      benchmark_record[i] = b - a ; 
     } 
    } 

return; 

}

如果我跑「MSR_vs_MMIO 0」,我得到了爲數約310 如果我運行「MSR_vs_MMIO 1」,我得到了40左右的數字。

我在x2APIC啓用和禁用的系統上進行測試。當我使用x2APIC啓動系統時,我運行測試「MSR_vs_MMIO 0」,並且當我禁用x2APIC啓動系統時,運行測試「MSR_vs_MMIO 1」。然後我收集數據並發現性能是巨大的不同。

所以看起來MMIO比MSR訪問快8倍。

這個結果是否如預期的那樣?是否有英特爾手冊(我搜索但沒有回答)上的任何文檔來描述x2APIC中的MSR與xAPIC中的MMIO之間的性能差異?

謝謝。

+1

這可能與時序無關,但是你的內聯asm被破壞;)相關的事情是_「WRMSR指令是序列化指令」_(引用指令集參考手冊:) – Jester

+0

你是傑斯特,你能不能指出我的內聯繫統壞了? – lullaby2005

+0

你在不告訴編譯器的情況下將'eax'和'edx'置零,你需要對它們進行破壞,或者更好的做法是將輸入作爲「a」(0),「d」(0)'並且將movl單曲。 – Jester

回答

0

假設您的系統以x2apic模式啓動,禁用APMI的MMIO接口,因此您的MMIO代碼實際上並未訪問APIC。請參閱Intel SDM第10.12.2節。

+0

感謝您的意見prl。其實我在x2APIC啓用和禁用的系統上進行測試。當我使用x2APIC啓動系統時,我運行測試「MSR_vs_MMIO 0」,並且當我禁用x2APIC啓動系統時,運行測試「MSR_vs_MMIO 1」。然後我收集數據並發現性能是巨大的不同。 – lullaby2005

+0

好的。你應該在你的問題中說你在兩次測試之間重新啓動。 – prl

+0

對不起,我的壞。我會更新它。 – lullaby2005