Vシステムクイックスタートガイド

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 CPUIntel Xeon Silver 4108 1.80GHz 8コア x 1
VHメモリ容量96GB
ローカルHDD容量2TB
ネットワークインタフェース1Gbps Gigabit Ethernet x 1
搭載VEType 10C(268.8GFLOPS/コア) 1.4GHz 8コア x 1
VE演算性能2.15TFLOPS
VEメモリ帯域0.75TB/s
VEメモリ容量24GB

2.2. 演算ノード

VH CPUIntel Xeon Gold 6148 2.4GHz 20コア CPU x 1
VHメモリ容量96GB
ローカルHDD容量240GB
ネットワークインタフェースFDR 56Gbps InfiniBand x 1
搭載VEType 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. ジョブ投入・実行

  1. 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へログインしていることを確認してください。その他のフロントエンドで実行した場合は失敗します。

  2. ソースコードのコンパイル
    • 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
      
  3. プログラムの実行
    • フロントエンド(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以下にしてください。

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_PROGINFYES または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)