メモリ帯域幅
メモリ帯域幅(メモリたいいきはば、英:Memory_bandwidth)とは、プロセッサが半導体メモリからデータを読み取ったり、半導体メモリにデータを格納したりする速度のことである。
解説
[編集]メモリ帯域幅は通常、バイト/秒の単位で表されるが、一般的に使用される8ビットバイトの倍数ではない自然なデータサイズを持つシステムでは異なる場合がある。
あるメモリやシステムで宣伝されているメモリ帯域幅は、通常、理論上の最大帯域幅である。実際に観測されるメモリ帯域幅は、宣伝されている帯域幅よりも小さくなる(そして、宣伝されている帯域幅を超えないことが保証される)。さまざまなアクセスパターンを使って持続的なメモリ帯域幅を測定する、さまざまなコンピュータベンチマークが存在する。これらは、さまざまなクラスの実アプリケーションでシステムが維持すべきメモリ帯域幅を知るためのものである。
測定規則
[編集]「バイト/秒」単位で転送されるデータ量を定義するには、次の 3 つの異なる規則がある。
- bcopy規則:単位時間あたりにメモリ上のある場所から別の場所にコピーされるデータ量を数える。たとえば、1秒間に100万バイトをメモリ上のある場所から別の場所にコピーすると、1秒間に100万バイトとカウントされる。bcopy規約は自己整合的であるが、より複雑なアクセスパターン、例えば3回の読み出しと1回の書き込みのようなケースをカバーするために拡張することは容易ではない。
- STREAM規約: アプリケーションコードが明示的に読み取るデータ量と、アプリ ケーションコードが明示的に書き込むデータ量を合計する。前述の100万バイトのコピーの例 を使用すると、STREAM帯域幅は、1秒間に読み取る100万バイトと書き込む100 万バイト、合計200万バイト/秒としてカウントされる。STREAM規約は、ユーザーコードと最も直接的に結びついているが、ハードウェアが実 際に実行する必要のあるすべてのデータトラフィックをカウントしていない可能性がある。
- ハードウェア規約:データの動きがユーザーコードによって明示的に要求されたかどうかにかかわらず、ハードウェアによって読み書きされた実際のデータ量をカウントする。同じ100万バイトのコピーの例を使用すると、書き込み割り当てキャッシュポリシーのコンピュータシステムのハードウェア帯域幅には、ストアを実行する前にハードウェアがターゲット配列をメモリからキャッシュに読み込むため、さらに100万バイトのトラフィックが含まれる。このため、ハードウェアが実際に転送するのは、合計で毎秒300万バイトとなる。ハードウェア規約はハードウェアと最も直接的に結びついているが、ユーザーのコードを実装するのに必要な最小限のデータ・トラフィック量を表していない場合がある。
- たとえば、一部のコンピュータシステムには、特別な命令 を使用して書き込み割り当てトラフィックを回避する機能があるため、実行されるデータトラフィッ クの量が異なると、帯域幅の比較が誤解を招く可能性がある。
帯域幅の計算と命名法
[編集]メモリ技術によって呼び方は異なるが、一般的なDDR SDRAM、DDR2 SDRAM、DDR3 SDRAMメモリでは、総帯域幅は以下の積となる。
- ベース DRAM クロック周波数
- 1 クロックあたりのデータ転送数: ダブル・データ・レート」(DDR、DDR2、DDR3、DDR4)メモリの場合は2回。
- メモリ・バス(インターフェイス)幅: DDR、DDR2、DDR3の各メモリ・インターフェイスは64ビット幅である。この64ビットを「ライン」と呼ぶこともある。
- インターフェイスの数: 最近のパソコンは通常、2つのメモリ・インターフェイス(デュアルチャネル・モード)を使用し、実効128ビットのバス幅を実現している。
たとえば、デュアルチャンネルメモリを搭載し、400MHzで動作するDDR2-800モジュールを各チャンネルに1つずつ搭載したコンピュータの理論上の最大メモリ帯域幅は次のようになる。
- 400,000,000 クロック/秒 × 2 列/クロック × 64 ビット/列 × 2 インターフェース =
- 102,400,000,000 (102.4 billion) ビット/秒(バイト単位換算では、12,800 MB/秒 あるいは 12.8 GB/秒)
この理論上の最大メモリ帯域幅は「バースト・レート」と呼ばれるが、これは持続可能とは限らない。
DDR、DDR2、DDR3モジュールの命名規則では、最大速度(例:DDR2-800)または最大帯域幅(例:PC2-6400)を指定している。 定格速度(800)は最大クロック速度ではなく、その2倍である(データレートが2倍になるため)。 指定の帯域幅(6400)は、64ビット幅を使用して1秒間に転送される最大メガバイトである。 デュアル・チャネル・モード構成では、これは実質的に128ビット幅となる。 したがって、この例のメモリ構成を単純化すると、デュアルチャネルモードで動作する2つのDDR2-800モジュールとなる。
モジュールあたり2つのメモリ・インターフェイスは、PCシステム・メモリの一般的な構成だが、シングル・チャネル構成は、古い、ローエンド、または低電力デバイスでは一般的である。一部のパソコンやほとんどの最新グラフィックカードは、2つ以上のメモリインターフェイスを使用している(例えば、インテルのLGA2011プラットフォームやNVIDIA GeForce GTX 980では4つ)。多くのインターフェイスを並列に実行する高性能グラフィックスカードは、非常に高い総メモリバス幅を達成することができる(例えば、NVIDIA GeForce GTX TITANでは384ビット、AMD Radeon R9 290Xでは512ビットで、それぞれ6個と8個の64ビットインターフェイスを使用)。
ECCビット
[編集]エラー訂正メモリ(ECC)を備えたシステムでは、インターフェイスの追加幅(通常は64ビットではなく72ビット)は帯域幅の仕様にカウントされない。 ECCビットは、ハードウェアに格納されている情報というよりも、メモリハードウェアの一部と考えた方がよい。
関連項目
[編集]脚注・参考文献
[編集]General
[編集]- BSS Random Access Benchmark Performance Evaluation and Optimization of Random Memory Access on Multicores with High Productivity at ACM/IEEE HiPC 2010