正如我们在x2APIC中所知,我们使用MSR而不是xAPIC使用的MMIO。 但根据我的测试,我发现MSR访问的速度比MMIO慢得多。
例如,在我的环境中,我编写了一个简单的测试用例,如下所示:
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倍。
这个结果是否符合预期?是否有关于英特尔手册(我搜索但没有答案)的任何文件来描述xAPAP中的MSR和xAPIC中的MMIO之间的性能差异?
感谢。
答案 0 :(得分:0)
假设您的系统在x2apic模式下启动,则禁用APIC的MMIO接口,因此您的MMIO代码实际上并未访问APIC。请参阅英特尔SDM第10.12.2节。