2017-10-09 380 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