2017-10-09 8 views
0

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のマニュアル(検索しましたが回答がありません)に関するドキュメントはありますか?

ありがとうございました。

+1

インラインasmが壊れているかもしれませんが、実際には_「WRMSR命令はシリアル化命令です」_(命令セットリファレンスマニュアルから引用しています) – Jester

+0

ありがとうあなたはジェスター、壊れたインラインasmを私に指摘してもらえますか? – lullaby2005

+0

コンパイラに知らせずに 'eax'と' edx'をゼロにしているのですが、それらを壊す必要があります。または、より良い方法として、入力を '' a '(0)、d'(0) 'として渡し、' movl 's。 – Jester

答えて

0

システムがx2apicモードで起動されていると仮定すると、APICへのMMIOインターフェイスは無効になるため、MMIOコードは実際にAPICにアクセスしません。インテルSDMセクション10.12.2を参照してください。

+0

ご意見ありがとうございました。実際に私はx2APICを有効にして無効にして私のシステムでテストを行っています。 x2APICを有効にしてシステムを起動すると、テスト「MSR_vs_MMIO 0」が実行され、x2APICを無効にしてシステムを起動すると、テスト「MSR_vs_MMIO 1」が実行されます。その後、私はデータを収集し、パフォーマンスが巨大であることを確認します。 – lullaby2005

+0

よろしくお願いします。あなたは2つのテストの間にリブートすることをあなたの質問で言うべきです。 – prl

+0

申し訳ありませんが、私の悪い。私はそれを更新します。 – lullaby2005

関連する問題