正如我们所知道的,在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倍左右。
这个结果和预期的一样吗?英特尔手册上有没有什么文档描述x2APIC中的MSR和xAPIC中的MMIO之间的性能差异?
谢谢。
发布于 2017-10-09 22:57:16
假设您的系统是在x2apic模式下引导的,那么到APIC的MMIO接口是禁用的,因此您的MMIO代码实际上并没有访问APIC。请参阅英特尔SDM第10.12.2节。
https://stackoverflow.com/questions/46647468
复制相似问题