正如我们在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