x2APICでは、xAPICで使用されるMMIOの代わりにMSRを使用しています。 しかし私のテストによると、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 周りの数を持って、I場合"MSR_vs_MMIO 1"を実行して、約40の番号を取得しました。
x2APICを有効にして無効にして私のシステムでテストします。 x2APICを有効にしてシステムを起動すると、テスト「MSR_vs_MMIO 0」が実行され、x2APICを無効にしてシステムを起動すると、テスト「MSR_vs_MMIO 1」が実行されます。その後、私はデータを収集し、パフォーマンスが巨大であることを確認します。
MMIOはMSRアクセスより約8倍高速です。
この結果は期待どおりですか? x2APICのMSRとxAPICのMMIOとのパフォーマンスの違いを説明するために、Intelのマニュアル(検索しましたが回答がありません)に関するドキュメントはありますか?
ありがとうございました。
インラインasmが壊れているかもしれませんが、実際には_「WRMSR命令はシリアル化命令です」_(命令セットリファレンスマニュアルから引用しています) – Jester
ありがとうあなたはジェスター、壊れたインラインasmを私に指摘してもらえますか? – lullaby2005
コンパイラに知らせずに 'eax'と' edx'をゼロにしているのですが、それらを壊す必要があります。または、より良い方法として、入力を '' a '(0)、d'(0) 'として渡し、' movl 's。 – Jester