Graviton4 は 1 vCPU だと Graviton3 より遅い? STREAM ベンチマークでメモリ帯域幅を調べていたときの話

Graviton4 は 1 vCPU だと Graviton3 より遅い? STREAM ベンチマークでメモリ帯域幅を調べていたときの話

2026.02.21

はじめに

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)を測定するベンチマークです。キャッシュに収まらない大きなデータセットを使い、メモリ帯域幅の性能を評価します。

https://www.cs.virginia.edu/stream/ref.html

以下の 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 で明示的に指定して最適化しました。

https://github.com/aws/aws-graviton-getting-started/blob/main/c-c++.md

シングルコア用

ビルド
# 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 が優勢です。

https://lemire.me/blog/2024/07/10/benchmarking-arm-processors-graviton-4-graviton-3-and-apple-m2/

Chips and Cheese の記事では Graviton4(Neoverse V2)のアーキテクチャが詳細に解説されており勉強になりました。ただ、今回の STREAM で Graviton4 が遅かった原因を特定できるものではありませんでした。

https://chipsandcheese.com/p/arms-neoverse-v2-in-awss-graviton-4

となるとビルドオプションや 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 が登場したら同様に検証したいです。

参考

この記事をシェアする

FacebookHatena blogX

関連記事