0. 概要

本パフォーマンス関連Tipsで解説する STREAM は、第4世代 AMD EPYC プロセッサを搭載するベア・メタル・シェイプ BM.Standard.E5.192 のインスタンス上で、 AMD Optimizing C/C++ and Fortran Compilers (以降 AOCC と呼称します。)で STREAM のソースコードをコンパイルして実行します。

以上より、本ドキュメントで解説する STREAM 実行は、以下の手順を経て行います。

  • BM.Standard.E5.192 インスタンス作成
  • STREAM ダウンロード・コンパイル
  • STREAM 実行

本パフォーマンス関連Tipsは、以下の環境で STREAM を実行しており、以下の性能が出ています。

[実行環境]

  • シェイプ: BM.Standard.E5.192
    • CPU: AMD EPYC 9654ベース x 2(192コア)
    • メモリ: DDR5 2.3 TB
    • 理論性能: 7.3728 TFLOPS(ベース動作周波数2.4 GHz時)
    • メモリ帯域: 921.6 GB/s
    • Simultanious Multi Threading (以降 SMT と呼称します。): 無効
    • NUMA nodes per socket (以降 NPS と呼称します。): 1 / 4
  • OS: Oracle Linux 9.5
  • コンパイラ: AOCC 5.0
  • STREAM
    • バージョン: 5.10
    • 配列サイズ(STREAM_ARRAY_SIZE): 430,080,000

[実行結果]

  • Triad(MB/s)
    • 715,650.4( NPS1 の場合)
    • 753,699.8( NPS4 の場合)

※1) NPS4 の場合は 1 に対して 5.3 パーセント の性能向上が見られます。


1. BM.Standard.E5.192インスタンス作成

本章は、 STREAM を実行するインスタンスを作成します。

作成するインスタンスは、 OCI HPCテクニカルTips集Oracle Linuxプラットフォーム・イメージベースのHPCワークロード実行環境構築方法 の手順に従い、以下属性のインスタンスを作成します。

※2)NPSSMT の設定方法は、 OCI HPCパフォーマンス関連情報パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法 を参照してください。


2. STREAMダウンロード・コンパイル

本章は、 STREAM のソースコードをダウンロードし、 AOCC でコンパイルして実行バイナリを作成します。

以下コマンドを STREAM を実行するノードの STREAM を実行するユーザで実行します。

$ mkdir ~/stream
$ cd ~/stream && wget http://www.cs.virginia.edu/stream/FTP/Code/stream.c
$ source /opt/aocc/setenv_AOCC.sh
$ clang -DSTREAM_TYPE=double -DSTREAM_ARRAY_SIZE=430080000 -O3 -mcmodel=large -fopenmp -fnt-store ./stream.c

3. STREAM実行

3-0. 概要

本章は、先に作成した STREAM の実行バイナリを使用し、以下の手順で STREAM を実行します。

  1. OS再起動(※3)
  2. STREAM 実行

※3)OS起動直後の状態でメモリ性能を計測する目的で実施します。

3-1. OS再起動

以下コマンドを STREAM を実行するノードのopcユーザで実行し、OSを再起動します。

$ sudo shutdown -r now

3-2. STREAM実行

以下コマンドを STREAM を実行するノードの STREAM を実行するユーザで実行します。
ここでは、 BM.Standard.E5.192STREAM の性能を最大化させるため、OpenMPのスレッド数とスレッド配置をそれぞれ環境変数 OMP_NUM_THREADSOMP_PLACESOMP_PROC_BIND で指定し、 STREAM を実行しています。

[ NPS1 の場合]

$ cd ~/stream && OMP_PLACES=0:96:2 OMP_NUM_THREADS=96 OMP_PROC_BIND=spread ./a.out
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 430080000 (elements), Offset = 0 (elements)
Memory per array = 3281.2 MiB (= 3.2 GiB).
Total memory required = 9843.8 MiB (= 9.6 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.
-------------------------------------------------------------
Number of Threads requested = 96
Number of Threads counted = 96
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 10875 microseconds.
   (= 10875 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:          681724.7     0.010136     0.010094     0.010191
Scale:         685595.0     0.010068     0.010037     0.010095
Add:           721807.1     0.014329     0.014300     0.014359
Triad:         715650.4     0.014469     0.014423     0.014515
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------
$

[ NPS4 の場合]

$ cd ~/stream && OMP_PLACES=0:96:2 OMP_NUM_THREADS=96 OMP_PROC_BIND=spread ./a.out
-------------------------------------------------------------
STREAM version $Revision: 5.10 $
-------------------------------------------------------------
This system uses 8 bytes per array element.
-------------------------------------------------------------
Array size = 430080000 (elements), Offset = 0 (elements)
Memory per array = 3281.2 MiB (= 3.2 GiB).
Total memory required = 9843.8 MiB (= 9.6 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.
-------------------------------------------------------------
Number of Threads requested = 96
Number of Threads counted = 96
-------------------------------------------------------------
Your clock granularity/precision appears to be 1 microseconds.
Each test below will take on the order of 9512 microseconds.
   (= 9512 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:          719952.6     0.009600     0.009558     0.009660
Scale:         705125.1     0.009805     0.009759     0.009873
Add:           752324.6     0.013776     0.013720     0.013820
Triad:         753699.8     0.013741     0.013695     0.013785
-------------------------------------------------------------
Solution Validates: avg error less than 1.000000e-13 on all three arrays
-------------------------------------------------------------
$

更新日時: