x2APIC中的MSR性能

时间:2017-10-09 13:18:25

标签: assembly x86 intel interrupt-handling

正如我们在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之间的性能差异?

感谢。

1 个答案:

答案 0 :(得分:0)

假设您的系统在x2apic模式下启动,则禁用APIC的MMIO接口,因此您的MMIO代码实际上并未访问APIC。请参阅英特尔SDM第10.12.2节。