SX-Aurora TSUBASAではじめるベクトルプログラミング(PDF)

【基本】CPUやGPUのメモリバンド幅の計算方法と測定方法(DDR4/GDDR6/HBM2等)

この記事は約14分で読めます。

みなさん、こんにちわ。Vectory(@vectorywork)です。

 

今回はメモリ性能について書きたいと思います。

メモリの理論計算性能は簡単に計算できますので、分からなくなったら自分で計算してみてください。

 

CPUの性能についてはこちら↓をどうぞ。

 

メモリ性能とは?メモリ帯域?メモリバンド幅?

メモリ性能は、「一秒間あたりにどれだけのデータを転送できるか」を示す「GB/s」で表されます。

 

「メモリ帯域」といったり、「メモリバンド幅(memory bandwidth)」と言ったりもします。

「帯域」なんて滅多に使わない用語なので、なんだか専門用語って感じですね。

 

データ転送と言う意味だとネットワークの性能を表すときもありますが、こちらは「Gbps」で表現されることが多いですかね。

 

メモリバンド幅の計算方法

メモリバンド幅は、基本的には、以下の3つの要素で決まります。

  • メモリクロック
  • バス幅
  • メモリチャネル数

 

メモリバンド幅について分かりやすく説明するために、例によって道路に例えて見ました。

データ=荷物の運搬というわけですね。

 

メモリクロック=車の速度

メモリクロックは、車の速度としましょう。

速ければ当然性能は良いことになります。

 

バス幅=道幅

道幅

バス幅は、道路の道幅としましょう。

※バス幅は、一度の伝送で同時に送れるデータ量のことで、単位には主にビット(bit)やバイト(Byte)が用いられます。

 

道路(バス幅)が広いほど、大きな車が通れることとします。

※例として「車の積載量」にしようか迷いましたが、「バス幅」というくらいなのでここでは「道幅」という表現にしました。

 

メモリチャネル数=道路の本数

メモリチャネル数は、道路の本数としましょうかね。

道路の本数が多ければ同時に走れる車も多くなりますね。

 

イメージ例:車と道路に例えた場合

  • 車の速度:時速30km
  • 道路の幅:2m(2t車)
  • 道路の本数:2本

この場合は、

30km/h x 2t x 2本 = 140km・t/h

というような計算が出来ます。

※あくまでイメージなので単位は気にしないで下さい←オイ

 

トラック

同様に、

  • 車の速度:時速80km
  • 道路の幅:6m(6t車)
  • 道路の本数:1本

という場合には、

80km x 6t x 1本 = 480km・t/h

というような計算が出来ますね。

 

 

メモリバンド幅もイメージは同じ

メモリバンド幅の計算も同様になります。

 

  • メモリクロック:2.400GHz
  • バス幅:8Byte(64bit)
  • チャネル本数:6本

というような場合には、

 

2.400GHz x 8B x 6本 = 92.16GB/s

というような計算式になります。

 

※余談ですが、Hz(ヘルツ)って秒の逆数なんですよね。なので計算結果の単位がが「/s」になります。

 

【例題】DDR4やGDDR5、HBM2あたりのCPUやGPUのメモリバンド幅の理論値を計算してみた

というわけで、CPUやGPUのメモリバンド幅を計算してみましょう。

 

「メモリクロック・バス幅・チャネル本数」の3つを調べて、掛け算するだけですので計算自体は楽勝だと思います。

 

混乱するところがあるとすれば、「メモリ性能なのでメモリ側だけを調べればOKというわけではない」点でしょうか。

チャネル本数についてはCPUの側のチップセットにもよるので、どちらかというとCPU側を中心に調べる必要があります。

 

Intel Xeon Gold 6000シリーズ

Intel Xeon Gold 6000シリーズの製品ページから各CPUの仕様のページに行くとメモリの性能が公表されています。

  • 最大メモリー動作周波数:2666 MHz
  • 最大メモリーチャネル数:6

と、今回調べたい値が、そのまま書いてあります。

 

バス幅はどこに書いてあるんじゃろか。。

バス幅については、記載が無いので混乱してしまうかもしれませんね。

 

DDR/DDR2/DDR3/DDR4と言ったようなDDRメモリのバス幅は「8Byte(64bit)」です。

 

ここは固定ですので覚えてしまいましょう。

 

まとめると、Intel Xeon Gold 6000シリーズのメモリバンド幅は、

2666MHz x 8Byte x 6ch = 128GB/s

となります。

 

補足ですが、2666MHz というのは、実は1333MHz x 2です。
この「x 2」は「data transfer per clock」 を意味します。
この値はだいたい2です。気になる人はそういうものだと思って覚えておきましょう。色々調べていくとメモリクロックやバスクロック(FSB)とかDDR3とかDDR4とか色々でてきますが、基本的にはDDR4-2666の後半の数字がメモリの速度を表すものだと思っておけばOKです。

参考までに以下は簡単な表ですが、メモリクロックが同じでも世代によって2倍2倍とFSBの性能値が上がっていくことが分かりますね。あと実は消費電力も下がってます。

メモリ
クロック
バスクロック(Front Side Bus)
DDR(2.5V)DDR2(1.8V)DDR3(1.5V)DDR4(1.2V)
100100200400800
1331332665331066
1661663336671333
2002004008001600
26626653310662133

Intel Core i7-8700

デスクトップパソコン用のCPUも同様に性能を計算することができます。

製品ページにいってスペックを確認すると

  • 最大メモリー動作周波数:2666 MHz
  • 最大メモリーチャネル数:2

なので、

2666MHz x 8Byte x 2ch = 42GB/s

となります。

 

このようにして見てみるとパソコン用のCPUはサーバ用のCPUに比べてメモリ性能が低いと言うことがわかりますね。

 

AMD EPYC 7000シリーズ

同様にAMD EPYC 7000シリーズの各CPUの仕様のページからを見ると、

  • 最大メモリー速度:2666 MHz
  • メモリー・チャネル:8

とありますのでAMD EPYC 7000シリーズのメモリバンド幅は、

2666MHz x 8Byte x 8ch = 170GB/s

となります。

 

AMD Ryzen 5 2600

AMDのパソコン用のCPUのメモリ性能を見てみると、

  • 最大メモリー速度:2933 MHz
  • メモリー・チャネル:2

ですので、性能値は

2933MHz x 8Byte x 2ch = 46GB/s

となりますね。

NVIDIA Quadro RTX 6000(Turing)

NVIDIA Quadroシリーズの上位機種はGDDR6というメモリが使われています。

GDDRとはグラフィック用のメモリのことで一般的に通常のDDRメモリよりもメモリインターフェース(バス幅)の性能が高く高速です。

※GDDRについてはasciiのサイトマイナビの記事が参考になるかもです。

 

しかし、メモリ性能の計算方法については、今までと変わりませんのでご安心を。

NVIDIAの資料(pdf)を参照すると

  • Memory Interface:384-bit
  • Memory Clock (Data Rate):14 Gbps

とあります。

この値を掛け合わせると、

14Gbps x 48Byte(384bit) = 672GB/s

メモリバンド幅が出てきます。

CPUのときと何やら違いますが、こういうものだと思っておけはOKです。

 

NVIDIA Tesla V100(Volta)

NVIDIA Tesla V100は、HBM2という積層型メモリが使われています。

GDDR6より更に早いメモリだと思ってもらえればOKです。

 

ちなみにHBM2のチップ一枚で1024bitのメモリバスになります。

HBMアーキテクチャでは、128-bit幅のメモリチャネルを8チャネル1組で取り扱う。128-bit x 8チャネル=1,024-bitで、1,024-bitのメモリバス幅となる。

https://pc.watch.impress.co.jp/docs/column/kaigai/1112390.html

 

それではTesla V100のメモリ性能を計算してみましょう。

HBM2だからといって理論演算性能の算出方法も難しいことはありません。

 

同様にNVIDIA Tesla V100の製品サイトから必要そうな情報をピックアップします。

  • Maximum memory clock:877 MHz
  • Memory bus width:4096 bit

と書いてありますね。

これをかけ合わせると、

877MHz x 512Byte(4096bit) x2 = 898GB/s

となりますね。

 

https://images.nvidia.com/content/volta-architecture/pdf/volta-architecture-whitepaper.pdf

ちなみに先程HBM2は1つあたり1024bitと言いました。

V100の図を見てみるとHBM2が4つ記載があります。

1024 x 4=4096でV100のメモリバス幅の4096bitと一致しますね。

 

理化学研究所(富士通)京(SPARC64 VIIIfx)

ちなみに事業仕分けで話題となった京は、4チャネルのDDR3メモリインタフェースの構造となっていて64GB/sとのことです。(参考)

2GHz? x 8Byte x4ch = 64GB/s
といったところでしょうか。

SX-Aurora TSUBASA

SX-Aurora TSUBASAのメモリバンド幅は、製品サイトに行くと1.22TB/sとありますね。

6 個のHBM2メモリを実装しているとのことですのでメモリバス幅は6144 bitでしょうか。

1.588GHz? x 768Byte(6144bit) = 1.22TB/s

ダントツですね。。。

パソコンCPUの約30倍ですね。恐るべし。。。

 

メモリ性能比較

上記で計算したメモリ達を並べるとこんな感じですね。

CPUメモリメモリ性能
Intel Xeon Gold 6000DDR4128GB/s
Intel Core i7-8700DDR442GB/s
AMD EPYC 7000DDR4170GB/s
AMD Ryzen 5 2600DDR446GB/s
NVIDIA Quadro RTX 6000GDDR6672GB/s
NVIDIA Tesla V100HBM2900GB/s
京(SPARC64 VIIIfx)DDR364GB/s
SX-Aurora TSUBASAHBM21.22TB/s

 

グラフにするとこんな感じです。

こっちのほうがわかりやすいですかね?

可視化大事!

 

メモリバンド幅をSTREAMというベンチマークで測定してみた

メモリバンド幅は、STREAMというベンチマークツールを使って測定することが多いみたいです。

実際に測定してみようと思ったんですが、STREAMは基本的にはLinux用のようなので、ひとまず今回は見送ることにしました。

時間があったら今度やってみようと思います。

 

WSL(Windows Subsystem for Linux)でSTREAM実行してみた

STREAM実行してみました。

 

STREAMはLinux用とのことなので、Windows上でLinuxの環境が構築できるWSL(Windows Subsystem for Linux)というものをインストールしてみました。

ちなみに今回設定したLinuxはUbuntuです。

※インストール方法はググってみてください。

 

まずはSTREAMを入手します。

XXXXXXXXXX:~$ git clone https://github.com/jeffhammond/STREAM.git

 

入手したらgccでコンパイルしましょう。

XXXXXXXXXX:~/STREAM$gcc stream.c

 

コンパイル出来たら実行します。

XXXXXXXXXX:~/STREAM$ ./a.out
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 10000000 (elements), Offset = 0 (elements)
Memory per array = 76.3 MiB (= 0.1 GiB).
Total memory required = 228.9 MiB (= 0.2 GiB).
Each kernel will be executed 10 times.
The *best* time for each kernel (excluding the first iteration)
will be used to compute the reported bandwidth.
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 28027 microseconds.
(= 28027 clock ticks)
Increase the size of the arrays if this shows that
you are not getting at least 20 clock ticks per test.
-------------------------------------------------------------
WARNING -- The above is only a rough guideline.
For best results, please be sure you know the
precision of your system timer.
-------------------------------------------------------------
Function Best Rate MB/s Avg time Min time Max time
Copy: 6372.2 0.026479 0.025109 0.027848
Scale: 6406.5 0.026371 0.024975 0.027436
Add: 8726.6 0.028801 0.027502 0.030176
Triad: 8654.3 0.030292 0.027732 0.043302
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------

結果出ましたね。

「Copy・Scale・Add・Triad」で結果が出ていますね。

Best Rate MB/sを見てみると、Addが一番性能が出ていて8726MB/s(8.7GB/s)です。

 

私のパソコンはCore i5 3570KでDDR3-1600のメモリを利用していたので、理論性能は

1600MHz x 8Byte x 2ch = 25.6GB/s

です。

なので実効性能は理論性能の34%くらいですかね。

 

まとめ:メモリバンド幅の理論値計算はそれほど難しくない

さてさて、色々なCPUを例にメモリバンド幅の計算してみました。

 

メモリバンド幅は、算出に必要な値が公開されていないこともありますし、分かりづらいところもあると思います。

ただ、計算自体はそれほど難しくないと思います。

それくらいで良いのかなと思います←

 

さて、今日はここまで!

おわりっ!