3

私の仕事は、RAM の読み取り/書き込み速度を計算することです。コンパイラの最適化を避けるために asm 挿入を使用しています。時間を測定するには、TSC と CPU 周波数を使用します。データを移動するには、キャッシュ階層を使用しない asm 命令 MOVNTDQ を使用します。

問題は結果です。データ レート (データシートによる) は 800 Mbps で、私のテストでは 2000 Mbps を超える書き込み速度が得られました。

void memory_notCache_write_128(void* src, long blocks_amount) 
{
    _asm    
    {
        mov ecx, blocks_amount
        mov     esi, src
    a20:
        movntdq [esi], xmm0
        movntdq [esi + 16], xmm1
        movntdq [esi + 32], xmm2
        movntdq [esi + 48], xmm3
        movntdq [esi + 64], xmm4
        movntdq [esi + 80], xmm5
        movntdq [esi + 96], xmm6
        movntdq [esi + 112], xmm7
        add esi,  128
        loop    a20;
    }
}

int main()
{ 
    unsigned __int64 tick1, tick2;
    const long nBytes = 32*KByte;   

    char* source = (char*)_mm_malloc(nBytes*sizeof(char),16);

    tick1 =  getTicks();
    memory_notCache_write_128(source, current_times.t128);
    tick2 =  getTicks();

    double time = (double)(tick2-tick1)/(ProcSpeedCalc());
    cout << "Time WRITE_128[seconds]:" << time << endl;
    cout << (double) nBytes / time / MByte << endl;

    return 0;
}

私が使用したRAMのデータシート - http://www.alldatasheet.com/datasheet-pdf/pdf/308537/ELPIDA/EBE11UE6ACUA-8G-E.html

ソースコード (Win patform 用に作成): https://bitbucket.org/closed_eyes/ram_speed_for_win/downloads/memory_test.cpp

4

2 に答える 2

4

この種のコードには、非一時的な操作を使用しないでください。メモリパフォーマンステスターを構築する実際の方法は、アクセスパターンを使用して、キャッシュにヒットしないことを確認することです。通常、これは、ストライドがキャッシュラインサイズと同じであるシステムのキャッシュの最後のレベルよりも大きい非常に大きなメモリチャンクをループすることによって行われます。これを行うと、すべてのアクセスがすべてのレベルでキャッシュミスになることが保証されます。ただし、メモリから1バイトだけを読み取ると、プロセッサがキャッシュライン全体をフェッチすることを忘れないでください。したがって、64ビットのロードを行う場合、64バイトのキャッシュラインを備えたマシン(非常に一般的)では、メモリから読み取られるものとして64バイトをカウントする必要があります。

于 2012-06-05T00:21:44.163 に答える
2

Yury、movntdq を使用して「物理的な」メモリ チャネル帯域幅を測定するというあなたの考えは正しいです。「システム全体」のメモリ パフォーマンスに対処する方法について Nathan Binkert に同意しますが、一般的な movntdq の適用可能性と 800Mbps の混乱に関する最初の質問について詳しく説明したいと思います。

短縮版:

  1. movntdq正常に動作し、「物理」メモリ チャネルの帯域幅を測定する場合に使用しても問題ありません。
  2. 800Mbps は「ビットレーン」仕様です。各 (場合によっては 2 つの) メモリ コントローラ チャネルは 64 ビット幅です。2 つのメモリ コントローラー チャネルは 1600MBytes/s 近くの raw 書き込みパフォーマンスを提供しますが、これは実際の測定値とはまだ一致しないため、以下の詳細をご覧ください。
  3. 本当にrdtscの使用をやめてください。andはプロファイリングにのみ 使用し、測定精度に問題がある場合はテスト バッファ サイズを増やしてください。QueryPerformanceFrequencyQueryPerformanceCounter
  4. ハードウェア プラットフォームの詳細 (CPU、sodimm の数など) を指定してください。BIOS セットアップでメモリのオーバークロックがないことを確認してください。

ロングバージョン。

  1. 短いバージョンのように: movntdq は問題ありません。一連の movntdq 書き込みが CPU キャッシュ ライン (64 バイト) の倍数になるように配置し、movntdq書き込みの開始を 64 バイト境界に配置する必要があります。アラインされていないアクセスを使用すると、命令の非一時的なヒントが無効になるため、関数memory_notCache_write_32memory_notCache_write_16関数の両方が命令を使用する正しい選択ではありませんmovndq
  2. 短いバージョンのように: 800Mbps は単一のビットレーンの速度です。SODIMMデータ パスは、CPU/ノースブリッジ メモリ チャネルと同じ 64 ビットです。命令について話すとき、movntdqおそらく 2 つのメモリ チャネルがありますが、メインボードの右側のメモリ スロットに 2 つの一致する SODIMM が取り付けられている場合にのみ、「デュアル チャネル」モードで動作します。2 つのチャネルでは効果的に 1600 Mbytes/s が得られますが、単一チャネルでは 800Mbytes/s のパフォーマンスが得られます。実際の数値は 1600Mbytes/s の推定値とそれほど変わらなくなりましたが、それでも厳密には一致していません。これは、誤った測定方法 (ポイント 3 を参照) および/またはオーバークロックされたメモリ (可能性は低いですが、念のためポイント 4 を参照) の両方が原因である可能性があります。
  3. "QueryPerformanceFrequencyそしてQueryPerformanceCounter、誰にとっても十分なはずです" :) 真剣に、rdtscプロジェクトのこの段階で使用をやめてください. QueryPerformanceFrequency10M バイトのメモリ領域を超えるメモリ書き込みパフォーマンスを測定する場合、3 MHz 以上のタイマー精度 ( ) は問題ありません。3MHz タイマーの各ティックで 1600MBytes/s の理論上のメモリ帯域幅が 533 バイトの「測定エラー」になると考えてください。rdtsc は主に、電源管理が有効になっている CPU では時間の経過とともに安定しないため、非常に扱いにくいものです (rdtsc安定したカウントを提供する第 2/第 3 世代の Intel Core CPU を使用していないことは確かです)。タイミング測定のためにシステムが提供する関数から始めて、測定が正しく行われるようにしてください。これ'QueryPerformanceFrequency
  4. 物理メモリ チャネルの帯域幅を測定しているので、そのような測定に使用しているハードウェア プラットフォームを指定する価値があります。BIOS セットアップで手動のメモリ タイミング設定を行っていないことを確認してください (メモリ コントローラがデュアル チャネル モードの場合、533MHz メモリ バスを使用すると 2+GBytes/s のメモリ帯域幅が提供されます)。組み込みシステム ( SODIMM) を使用している場合、メモリ コントローラの設定が BIOS で微調整される可能性があります。オーバークロック設定がないことを再確認してください。

結論として - を使用せず、 とrdtscのみQueryPerformanceFrequencyを使用QueryPerformanceCounterし、アライメントされたバージョンのメモリ書き込みを使用し続けmovntdq、組み込みシステムの構成を確認してください。また、インライン アセンブリの使用を完全に回避し、代わりに使用に切り替えることを強くお勧めし_mm_stream_si128ます ( http://msdn.microsoft.com/en-us/library/ba08y07y.aspx ) 。

于 2012-08-13T10:22:58.523 に答える