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

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

    bcopy '関数は、ソースから宛先へバイトをコピーし、
  1. 他のやり方は、配列を割り当てて配列を歩き回ることです(いくつかのストライドで) - これは基本的に配列全体を読む時間を与えます。

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

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

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

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

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

=========

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

2
現在のマシンでのキャッシュの重要性を忘れているようです。そして、どのようにあなたのメモリ帯域幅を定義しますか?プログラマーの観点から見ると、それは本質的にmemcpyが得ているものです。また、他のプロセスがマシン上で動作している可能性があります(余分なコンテキストスイッチなど)。私はあなたが正確に測定したいことを理解していません!
追加された 著者 Basile Starynkevitch,
Basileのコメントはこの問題の中心にある...現代の消費者向けPCは猛烈に複雑な獣であり、あなたが見ているパフォーマンスはあなたがしていることに密接に依存しています。複数のレベルのキャッシュがあります。分岐予測、CPU内のスペキュラティブ実行パイプライン、割り込み;他のプロセス。 DMAペリフェラルは(複数の!)バスを使用したい。この質問はAppleの[+]でもっと意味をなさないでしょう。
追加された 著者 dmckee,

1 答え

私は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 %d\n", time, sum);
0
追加された