Graviton4 は 1 vCPU だと Graviton3 より遅い? STREAM ベンチマークでメモリ帯域幅を調べていたときの話
はじめに
Graviton の世代間でメモリ帯域幅にどの程度の差があるか気になり、STREAM ベンチマークで検証していました。諸事情により最初は 1 vCPU の medium インスタンスで計測することになり、Graviton4 が Graviton3 より遅いという予想外の結果になりました。medium 縛りの検証は後にしてコア数を増やして追加検証した記録を書き残します。
検証結果のサマリー
結論から述べます。コア数によって性能比較の結果が逆転しました。
| 条件 | 結果 | 備考 |
|---|---|---|
| 1 vCPU(medium) | Graviton4 が全操作で 14〜23% 遅い | シングルコアでは前世代より遅い結果になった |
| 64 vCPU(16xlarge) | Graviton4 が全操作で 80〜100% 速い | メモリチャネル数の差が大きくでた |
Graviton4 は DDR5-5600 x 12ch を搭載しています。広帯域メモリは多数のコアが同時にアクセスして価値があります。
以降、検証環境と詳細な結果を順に見ていきます。
Graviton3 と Graviton4 のアーキテクチャ比較
まず両世代のスペックを整理します。
| 項目 | Graviton3 | Graviton4 |
|---|---|---|
| Core | Neoverse V1 | Neoverse V2 |
| L2 キャッシュ(コアあたり) | 1 MB | 2 MB |
| DDR | DDR5-4800 × 8ch | DDR5-5600 × 12ch |
| メモリ帯域幅(理論値) | 307.2 GB/s | 537.6 GB/s |
スペック上は Graviton4 が圧倒的に優れています。とくにメモリ帯域幅の理論値は 1.75 倍です。この差がベンチマークにどう現れるかを見ていきます。
STREAM ベンチマークとは
STREAM は CPU とメインメモリ間のメモリ帯域幅(MB/s)を測定するベンチマークです。キャッシュに収まらない大きなデータセットを使い、メモリ帯域幅の性能を評価します。
以下の 4 つのテストで構成されます。
| 名前 | カーネル | バイト/回 | FLOP/回 |
|---|---|---|---|
| Copy | a(i) = b(i) |
16 | 0 |
| Scale | a(i) = q*b(i) |
16 | 1 |
| Add | a(i) = b(i) + c(i) |
24 | 1 |
| Triad | a(i) = b(i) + q*c(i) |
24 | 2 |
STREAM にはコンパイル時パラメーター NTIMES があります。4 つのテストをそれぞれ NTIMES で指定した回数だけ繰り返し実行し、統計的な信頼性を確保します。今回はデフォルト値の 10 回(NTIMES=10)を使用しました。
検証環境
インスタンス構成
1 vCPU と 64 vCPU の 2 パターンで検証しました。Graviton3 と 4 の違い以外の基本的なスペックは合わせました。
| 項目 | m7g.medium(G3) | m8g.medium(G4) |
|---|---|---|
| CPU | Graviton3 | Graviton4 |
| vCPU | 1 | 1 |
| メモリ | 4 GiB | 4 GiB |
| DDR | DDR5-4800 × 8ch | DDR5-5600 × 12ch |
| OS | Ubuntu 24.04 LTS(arm64) | Ubuntu 24.04 LTS(arm64) |
| GCC | 13.3.0 | 13.3.0 |
| リージョン | us-east-1 | us-east-1 |
| 項目 | m7g.16xlarge(G3) | m8g.16xlarge(G4) |
|---|---|---|
| CPU | Graviton3 | Graviton4 |
| vCPU | 64 | 64 |
| メモリ | 256 GiB | 256 GiB |
| DDR | DDR5-4800 × 8ch | DDR5-5600 × 12ch |
| OS | Ubuntu 24.04 LTS(arm64) | Ubuntu 24.04 LTS(arm64) |
| GCC | 13.3.0 | 13.3.0 |
| リージョン | us-east-1 | us-east-1 |
STREAM のダウンロードとビルド
まず STREAM のソースコードを公式サイトからダウンロードします。
cd ~
wget https://www.cs.virginia.edu/stream/FTP/Code/stream.c
Graviton 向けのガイドを参考に -mcpu で明示的に指定して最適化しました。
シングルコア用
# Graviton3 (m7g) 上で実行
gcc -O3 -mcpu=neoverse-v1 -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=10 stream.c -o stream
# Graviton4 (m8g) 上で実行
gcc -O3 -mcpu=neoverse-v2 -DSTREAM_ARRAY_SIZE=100000000 -DNTIMES=10 stream.c -o stream
./stream
マルチコア用(64 vCPU)
# Graviton3 (m7g.16xlarge) 上で実行
gcc -O3 -mcpu=neoverse-v1 -fopenmp -mcmodel=large -fno-PIC \
-DSTREAM_ARRAY_SIZE=500000000 -DNTIMES=10 \
stream.c -o stream_mp
# Graviton4 (m8g.16xlarge) 上で実行
gcc -O3 -mcpu=neoverse-v2 -fopenmp -mcmodel=large -fno-PIC \
-DSTREAM_ARRAY_SIZE=500000000 -DNTIMES=10 \
stream.c -o stream_mp
OMP_NUM_THREADS=64 OMP_PROC_BIND=spread ./stream_mp
各種フラグの意味をまとめておきます。-mcmodel=large の指定が必要になり、さらに -fno-PIC も必要になったため、備忘録として残します。
| フラグ | 意味 |
|---|---|
-O3 |
最適化レベル 3 |
-mcpu=neoverse-v1 |
Graviton3(Neoverse V1)向けの最適化 |
-mcpu=neoverse-v2 |
Graviton4(Neoverse V2)向けの最適化 |
-DSTREAM_ARRAY_SIZE=100000000 |
シングルコア向けのテスト配列サイズ 1 億要素(約 2.2 GiB) |
-DSTREAM_ARRAY_SIZE=500000000 |
マルチコア向けのテスト配列サイズ 5 億要素(約 11.2 GiB) |
-DNTIMES=10 |
各テストを内部で 10 回繰り返し実行 |
-fopenmp |
OpenMP マルチスレッド有効化 |
-mcmodel=large |
静的配列が 4 GiB を超える場合に必要だった |
-fno-PIC |
Ubuntu のデフォルト -fPIC が -mcmodel=large と競合するため必要になった |
OMP_NUM_THREADS=64 |
64 スレッドで並列実行 |
OMP_PROC_BIND=spread |
スレッドを物理コアに均等分散配置 |
検証結果: 1 vCPU
1 vCPU(medium インスタンス)での Best Rate 比較です。
| Function | G3(m7g.medium) | G4(m8g.medium) | 比較 |
|---|---|---|---|
| Copy | 55,488 MB/s | 47,464 MB/s | -14.5% |
| Scale | 51,758 MB/s | 39,668 MB/s | -23.4% |
| Add | 49,111 MB/s | 38,912 MB/s | -20.8% |
| Triad | 48,727 MB/s | 39,329 MB/s | -19.3% |
Graviton4 が全項目で Graviton3 より 14〜23% 遅い結果でした。スペック上は Graviton4 が優れているはずなのになぜだとなり、1 コアでは性能を引き出せていない可能性があるため 64 vCPU で追加検証することになったのがことの発端です。
検証結果: 64 vCPU
64 vCPU(16xlarge インスタンス)での Best Rate 比較です。
| Function | G3(m7g.16xlarge) | G4(m8g.16xlarge) | 比較 |
|---|---|---|---|
| Copy | 235,614 MB/s | 453,543 MB/s | +92.5% |
| Scale | 228,841 MB/s | 457,407 MB/s | +99.9% |
| Add | 241,037 MB/s | 435,365 MB/s | +80.6% |
| Triad | 241,429 MB/s | 434,545 MB/s | +80.0% |
64 vCPU では Graviton4 が全項目で Graviton3 を 80〜100% 上回りました。圧倒的に早い。
マルチコアによるスケール度合い
Triad は実際のワークロードに近しいテスト項目です。この結果で 1 vCPU から 64 vCPU へのスケーリングを比較します。
| 1 vCPU | 64 vCPU | スケール倍率 | |
|---|---|---|---|
| Graviton3 | 48,727 MB/s | 241,429 MB/s | ×4.95 |
| Graviton4 | 39,329 MB/s | 434,545 MB/s | ×11.05 |
Graviton3 は 64 コアでも約 5 倍にとどまりました。DDR5-4800 x 8ch のメモリバスがボトルネックと考えられます。一方、Graviton4 は約 11 倍にスケールしました。DDR5-5600 x 12ch の広帯域を活かせている結果ではないでしょうか。
考察
1 vCPU で Graviton4 が 14〜23% 遅かった原因を探るため、他のベンチマーク結果を調べてみました。
Daniel Lemire 氏のブログでは、各種シングルコアベンチマークで Graviton4 が Graviton3 を上回っています。メモリ帯域幅については「Graviton4 がわずかに良い程度」と報告されています。他のベンチマークではシングルコアでも Graviton4 が優勢です。
Chips and Cheese の記事では Graviton4(Neoverse V2)のアーキテクチャが詳細に解説されており勉強になりました。ただ、今回の STREAM で Graviton4 が遅かった原因を特定できるものではありませんでした。
となるとビルドオプションや OS の設定など、検証環境固有の要因も考えられます。ビルドは Graviton3,4 向けにそれぞれ最適化したので問題はないはずなのですが。
そして、マルチコアだと 64 vCPU で結果が逆転しました。やっと納得できる結果となりました。Graviton4 は DDR5-5600 x 12ch を搭載しており、多数のコアが同時にメモリアクセスすることで広帯域の恩恵を受けられると考えられます。スケーリング倍率も Graviton3 の x4.95 に対して Graviton4 は x11.05 と大きな差がありました。
まとめ
STREAM ベンチマークで Graviton3 と Graviton4 のメモリ帯域幅を比較しました。
- 1 vCPU では Graviton4 が全操作で 14〜23% 遅い
- 64 vCPU では Graviton4 が全操作で 80〜100% 速い
- コア数によって結果は逆転する可能性がある
おわりに
諸事情により medium しか使えなかったのですが、シングルコアで動かすなら最新の CPU が必ずしも良い性能とは言えないことは学びになりました。実際のワークロードに近しい環境で動作検証が必要ですね。Graviton5 が登場したら同様に検証したいです。






