正如我們在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之間的性能差異?
謝謝。
這可能與時序無關,但是你的內聯asm被破壞;)相關的事情是_「WRMSR指令是序列化指令」_(引用指令集參考手冊:) – Jester
你是傑斯特,你能不能指出我的內聯繫統壞了? – lullaby2005
你在不告訴編譯器的情況下將'eax'和'edx'置零,你需要對它們進行破壞,或者更好的做法是將輸入作爲「a」(0),「d」(0)'並且將movl單曲。 – Jester