メインメモリの帯域幅測定

メインメモリの帯域幅を測定したいのですが、方法論を探しているうちに、

    bcopy ‘関数は、ソースから宛先へバイトをコピーし、

  1. 他のやり方は、配列を割り当てて配列を歩き回ることです(いくつかのストライドで) –
    これは基本的に配列全体を読む時間を与えます。

私は(1)データサイズが1GBで、バンド幅が「700MB/sec」です(コピーのために経過したサイクル数をカウントするために
rdtsc
を使用しました)。しかし、私はRAMの設定が次のようになっているため、これは正しくないと思われます。

  1. 速度:1333 MHz
  2. バス幅:32ビット

ウィキペディアによると、理論上の帯域幅は次のように計算されます:

クロック速度*バス幅* 1クロックサイクルあたりの#ビット/行(ddr 3の場合は2
  RAM)1333MHz * 32 * 2〜= 8GB /秒。

だから、私の推定帯域幅とはまったく異なります。私は何が間違っているの?

=========

その他の質問は、bcopyは読み取りと書き込みの両方を伴うことです。つまり、読み取り帯域幅または書き込み帯域幅だけを得るために、計算された帯域幅を2で割る必要があるということですか?帯域幅がレイテンシの逆数にすぎないかどうか確認したいと思いますか?帯域幅を測定する他の方法を提案してください。

ベストアンサー

私はbcopyの有効性についてコメントすることはできませんが、最も簡単なアプローチは、あなたが述べた2番目の方法です(ストライド1)。さらに、メモリ帯域幅の式のバイトを混同しています。
32ビット=
4バイト。最新のコンピュータは64ビット幅のメモリバスを使用します。あなたの効果的な転送速度(DDR3の技術を前提とした)

1333MHz * 64ビット/(8ビット/バイト)= 10666MB/s(PC3-10666とも呼ばれる)

1333Mhzには2つの転送/クロックがすでに組み込まれています。

Check out the wiki page for more info: http://en.wikipedia.org/wiki/DDR3_SDRAM

結果に関しては、アレイへのアクセスを再度試みてください。 Malloc
1GBを使用して全体を走査します。配列の各要素を合計して出力することができますので、コンパイラはデッドコードではないと考えます。

このようなもの:

double time;
int size = 1024*1024*1024;
int sum;
*char *array = (char*)malloc(size);
//start timer here
for(int i=0; i < size; i++)
  sum += array[i];
//end timer
printf("time taken: %f tsum is %dn", time, sum);

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です