2019/05/21 第1版
目次
1. Vシステムの概要
VシステムはSX-Aurora TSUBASA A100-1(フロントエンド: fvpu1)1台とA300-2(演算ノード: v001, v002)から構成されています。
SX-Aurora TSUBASAは主にx86/LinuxのOS処理を行うIntel Xeonプロセッサで処理を行うホスト(VH)とベクトル演算処理を行うNEC製ベクトルエンジン(VE)から構成されており、FOCUSスパコンVシステムでは1つのVHに1つのVEが搭載されたシステムになっております。
VE上で動作するベクトル演算プログラムはOS機能を提供するVH上でコンパイルし、通常のコマンドのように起動しVE上でシームレス実行されます。
2. Vシステムの仕様
2.1. フロントエンド
VH CPU | Intel Xeon Silver 4108 1.80GHz 8コア x 1 |
VHメモリ容量 | 96GB |
ローカルHDD容量 | 2TB |
ネットワークインタフェース | 1Gbps Gigabit Ethernet x 1 |
搭載VE | Type 10C(268.8GFLOPS/コア) 1.4GHz 8コア x 1 |
VE演算性能 | 2.15TFLOPS |
VEメモリ帯域 | 0.75TB/s |
VEメモリ容量 | 24GB |
2.2. 演算ノード
VH CPU | Intel Xeon Gold 6148 2.4GHz 20コア CPU x 1 |
VHメモリ容量 | 96GB |
ローカルHDD容量 | 240GB |
ネットワークインタフェース | FDR 56Gbps InfiniBand x 1 |
搭載VE | Type 10B(268.8GFLOPS/コア) 1.4GHz 8コア x 1 |
VE演算性能 | 2.15TFLOPS |
VEメモリ帯域 | 1.22TB/s |
VEメモリ容量 | 48GB |
3. Vシステムへのログイン方法
ログインノード(ssh.j-focus.jp:login[12]
)にログイン、またはSSL-VPN接続をしてからVシステムフロントエンド(fvpu1
)にログインしてコンパイルやデバッグジョブの実行、ジョブの投入を行います。
$ ssh fvpu1 Last login: 前回ログイン日時 from 前回ログイン時のホスト名 [利用者ID@fvpu1 ~]$
4. ジョブ投入・実行
- fvpu1での環境の設定
環境変数の設定
$ export VE_NODE_NUMBER=0
NEC開発環境(コンパイラ/MPI)のバージョン確認
$ module avail PrgEnv-nec MPI-nmpi
出力例
------------------- /home1/share/modulefiles -------------------- PrgEnv-nec-2.4.1 PrgEnv-nec-3.1.1 ------------------- /home1/share/modulefiles -------------------- MPI-nmpi-2.13.0 MPI-nmpi-2.5.0
NECコンパイラ環境の設定
module avail
コマンドで確認したNECコンパイラ環境を選択します。$ module load PrgEnv-nec-x.x.x
NEC MPI環境の設定
module avail
コマンドで確認したNEC MPI環境を選択します。$ module load MPI-nmpi-x.x.x
※
module load
を実行する際に、fvpu1
へログインしていることを確認してください。その他のフロントエンドで実行した場合は失敗します。 - ソースコードのコンパイル
- Fortranの場合
基本のコマンド$ nfort source.f90
OpenMP並列化プログラム
$ nfort -fopenmp -proginf -report-all source.f90
MPI並列化プログラム
$ mpinfort -report-all source.f90
非並列化プログラムの自動並列化
$ nfort -mparallel -proginf -report-all source.f90
- Cの場合
基本のコマンド$ ncc source.c
OpenMP並列化プログラム
$ ncc -fopenmp -proginf -report-all a.c
MPI並列化プログラム
$ mpincc -report-all source.c
非並列化プログラムの自動並列化
$ ncc -mparallel -proginf -report-all source.c
- C++の場合
基本のコマンド$ nc++ source.cpp
OpenMP並列化プログラム
$ nc++ -fopenmp -proginf -report-all a.cpp
MPI並列化プログラム
$ mpinc++ -report-all source.cpp
非並列化プログラムの自動並列化
$ nc++ -mparallel -proginf -report-all source.cpp
- Fortranの場合
- プログラムの実行
- フロントエンド(fvpu1)でのプログラム実行(デバッグ)
OpenMP、自動並列化プログラム
コマンドラインから直接実行してください。$ ./a.out
MPI並列化プログラム
mpirun
コマンド またはmpiexec
コマンドに、MPI 実行ファイルを指定して実行します。$ mpirun -np 8 ./a.out
注意: スレッドまたはプロセス数は8以下にしてください。
- 計算ノード(v001, v002)での実行
非並列化、OpenMP、自動並列化プログラム
以下のようなスクリプトを作成し、test_Vとして保存します。#!/bin/bash #SBATCH -p v006m #SBATCH -n 8 #SBATCH -J test_V #SBATCH -e test_V.e%J #SBATCH -o test_V.o%J module load PrgEnv-nec-x.x.x ./a.out
コマンドラインから
fjsub test_V.sh
としてジョブを投入してください。$ fjsub test_V.sh Submitted batch job ジョブID
実行中のジョブの状態を確認するには
squeue
コマンドを利用してください。$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) (ジョブの情報が出力される)
全てのジョブの実行が完了している場合は何も表示されません。
MPI並列化プログラム
以下のようなスクリプトを作成し、test_Vとして保存します。#!/bin/bash #SBATCH -p v024h #SBATCH -n 8 #SBATCH -J MPI_V #SBATCH -e MPI_V.e%J #SBATCH -o MPI_V.o%J module load PrgEnv-nec-x.x.x module load MPI-nmpi-x.x.x mpirun -np 8 ./a.out
コマンドラインから
fjsub MPI_V.sh
としてジョブを投入してください。$ fjsub MPI_V.sh Submitted batch job ジョブID
実行中のジョブの状態を確認するには
squeue
コマンドを利用してください。$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) (ジョブの情報が出力される)
全てのジョブの実行が完了している場合は何も表示されません。
注意: 現時点ではMPI並列化プログラムはノード内実行(1ノードでの実行)です。プロセス数は8以下にしてください。
- フロントエンド(fvpu1)でのプログラム実行(デバッグ)
5. VE上のプログラム実行状況のモニタリング
フロントエンド上でNEC開発環境の設定をし、環境変数export VE_NODE_NUMBER=0
を設定するとtop
コマンドでVEでのプログラム実行状況をモニタリングできます。
- 非並列化プログラム
実行例$ top top - 14:29:32 up 18 days, 1:00, 5 users, load average: 0.05, 0.01, 0.01 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 25165824 total, 24694784 free, 471040 used, 0 buff/cache KiB Swap: 0 total, 0 free, 0 used. 24694784 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 219243 uxxxXXXX - - 405504 405504 0 R 100.0 1.6 0:14.00 a.out
- 並列化プログラム
実行例$ top top - 14:31:21 up 18 days, 1:01, 5 users, load average: 1.84, 0.40, 0.14 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 25165824 total, 23777280 free, 1388544 used, 0 buff/cache KiB Swap: 0 total, 0 free, 0 used. 23777280 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 228463 uxxxXXXX - - 1323008 1.262g 0 R 800.0 5.3 1:46.00 a.out
/samp>
環境変数VE_NODE_NUMBER=0
を設定しないと以下のような警告が出力されます。
$ top top: Please specify VE Node to display information
module unload PrgEnv-nec-1.5.0
とするとtop
コマンドでVH上のプロセスの監視をするように戻ります。
$ module unload PrgEnv-nec-1.5.0
6. PROGINF機能
PROGINF
はプログラム全体の性能情報を出力する機能です。PROGINF
機能を使用する場合、-proginf
オプションを指定してプログラムをコンパイルします。その後、環境変数VE_PROGINF
にYES
またはDETAIL
を指定してプログラムを実行します。プログラムの実行終了時、プログラム全体の性能情報が出力されます。
MPI プログラムの場合、コンパイル時の-proginf
オプションは不要です。環境変数NMPI_PROGINF
にYES
を指定してプログラムを実行します。その結果、MPI プログラム実行全体の性能情報が出力されます。
- OpenMP並列化・自動並列化の場合の例
$ ncc –proginf source.c $ export VE_PROGINF=YES $ ./a.out ******** Program Information ******** Real Time (sec) : 100.795725 User Time (sec) : 100.686826 Vector Time (sec) : 41.125491 Inst. Count : 82751792519 V. Inst. Count : 11633744762 V. Element Count : 881280485102 V. Load Element Count : 268261733727 FLOP count : 625104742151 MOPS : 11778.920848 MOPS (Real) : 11765.127159 MFLOPS : 6209.015275 MFLOPS (Real) : 6201.744217 A. V. Length : 75.752090 V. Op. Ratio (%) : 94.002859 L1 Cache Miss (sec) : 6.364831 VLD LLC Hit Element Ratio (%) : 90.032527 Memory Size Used (MB) : 918.000000 Start Time (date) : Sat Feb 17 12:43:08 2018 JST End Time (date) : Sat Feb 17 12:44:49 2018 JST
- MPI並列化の場合の例
$ mpincc source.c $ export NMPI_PROGINF=YES $ mpirun –np 4 ./a.out MPI Program Information: ======================== Note: It is measured from MPI_Init till MPI_Finalize. [U,R] specifies the Universe and the Process Rank in the Universe. Times are given in seconds. Global Data of 4 processes : Min [U,R] Max [U,R] Average ========================== Real Time (sec) : 258.752 [0,1] 258.769 [0,0] 258.760 User Time (sec) : 258.632 [0,0] 258.672 [0,3] 258.661 Vector Time (sec) : 163.308 [0,3] 165.063 [0,2] 164.282 Inst. Count : 255247993643 [0,0] 255529897274 [0,3] 255372547702 V. Inst. Count : 19183106540 [0,0] 19190366299 [0,3] 19186786385 V. Element Count : 731572775534 [0,2] 731612551928 [0,3] 731597913441 V. Load Element Count : 213554974007 [0,0] 213586395765 [0,3] 213566855461 FLOP Count : 580774521087 [0,3] 580807048542 [0,0] 580790784573 MOPS : 4464.705 [0,2] 4465.784 [0,3] 4465.280 MOPS (Real) : 4462.927 [0,0] 4464.222 [0,3] 4463.583 MFLOPS : 2245.220 [0,3] 2245.688 [0,0] 2245.373 MFLOPS (Real) : 2244.435 [0,3] 2244.588 [0,1] 2244.519 A. V. Length : 38.124 [0,3] 38.138 [0,0] 38.130 V. Op. Ratio (%) : 79.541 [0,3] 79.559 [0,0] 79.551 L1 Cache Miss (sec) : 36.603 [0,2] 38.208 [0,3] 37.331 VLD LLC Hit Element Ratio (%) : 87.174 [0,1] 87.176 [0,2] 87.175 Memory Size Used (MB) : 912.000 [0,0] 912.000 [0,0] 912.000 Overall Data: ============= Real Time (sec) : 258.769 User Time (sec) : 1034.645 Vector Time (sec) : 657.127 GOPS : 14.966 GOPS (Real) : 14.960 GFLOPS : 8.981 GFLOPS (Real) : 8.978 Memory Size Used (GB) : 3.562
7. コンパイラ指示行
- C/C++の場合
#pragma _NEC コンパイラ指示オプション
例
#pragma _NEC ivdep
- Fortranの場合
!NEC$ コンパイラ指示オプション ・・・(自由形式) *NEC$ コンパイラ指示オプション ・・・(固定形式) cNEC$ コンパイラ指示オプション ・・・(固定形式)
例
cNEC$ loop_count(1000)