3. 使用方法

ここでは使用方法について最低限必要な事項を説明します。
詳しくは「FOCUSスパコン利用の手引き」を参考にしてください。

3.1 環境設定

標準のshellはbashです。
エディタはvimまたはemacsが使用できます。
必要なら、ホームディレクトリの以下のファイルを編集してください。

3.2 フロントエンドサーバーの作業内容

フロントエンドサーバーで以下の作業を行います。

  1. ソースコードの修正(必要なら)
  2. コンパイル・リンク
  3. 小さいジョブによるデバッグ作業とチューニング作業 (注1)
  4. ジョブ発行、ジョブ確認 (注2)
  5. 計算結果のログの確認
(注1)
通常のコマンドラインで実行プログラムを起動することができ課金されませんが、 計算時間(=1分)、プロセス数(=1)、メモリー(=1GB)等の制約があり、 簡単なテストのみを行うことができます(平成30年度現在)。
(注2)
sbatchコマンドでジョブを発行し使用時間に応じて課金されます。
なお、各システムにはデバッグ用のパーティションが用意されており、 それを用いると6分以内のジョブは課金されません(平成30年度現在)。

3.3 実行プログラムの作成

WinSCPを用いてソースコードを転送しコンパイル・リンクを行い、 実行プログラムを作成してください。
その他計算に必要なファイルがあれば転送してください。

3.4 moduleコマンド

コンパイラー(とそのバージョン)によって開発時と実行時に必要な環境変数が異なりますが、 FOCUSではmoduleコマンドにより一括設定できるようになっています。
設定するには以下のコマンドを実行します。
$ module load モジュール名
解除するには以下のコマンドを実行します。
$ module unload モジュール名
moduleコマンドのその他の使い方は以下の通りです。
$ module --help (使い方の説明)
$ module avail (使用可能なモジュール一覧を表示する)
$ module list (現在登録されているモジュールを表示する)
初期状態ではgcc4.4.7のみが使用可能になっています。

3.5 稼働状況コマンド

稼働状況を調べるコマンドは以下の通りです。
$ sinfo -s (A:割り当てられているノード数、I:使用可能なノード数)
$ freenodes (右の数字:割り当てられているノード数、左の数字:使用可能なノード数)
$ squeues (RUN:使用中のノード数、FREE:使用可能なノード数)
$ thismonth または uacct (今月の利用料金が表示されます)

3.6 ジョブ関係コマンド

ジョブ関係のコマンドは以下の通りです。
$ sbatch スクリプトファイル名 (ジョブの発行)
$ squeue (ジョブの実行状況の監視、自分の発行したジョブのみ)
$ scancel キュー番号 (ジョブの取り消しまたは中止、キュー番号はsqueueコマンドで表示される)

3.7 ジョブスクリプトファイル

以下ではOpenFDTDのプログラムを実行するジョブスクリプトファイルのサンプルを示します。

3.7.1 1ノード使用時

OpenMPを用いて1ノードで複数のスレッドで計算するときのスクリプトファイルは以下の通りです。
なお、行の先頭に"#"をつけるとコメント行になります。(SBATCH行のときは"##")

#!/bin/bash
#SBATCH -p f024h	(1)
#SBATCH -n 1		(2)
#SBATCH -c 40		(3)
#SBATCH -t 30		(4)
#SBATCH -J ofd		(5)
#SBATCH -o stdout.%J	(6)
#SBATCH -e stderr.%J	(7)

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}	(8)
./ofd_omp_gcc data/benchmark/benchmark2.ofd	(9)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。上の例はFシステムを用いて24時間以内で終わるジョブを表します。 ハーティションは稼働状況、ジョブの性質、利用料金等を判断して選択してください。
(2) OpenMPでは起動するプロセス数は1です。
(3) Fシステムは1ノード40コアなので40コアを指定しています。 コア数に比例して速くなるとは限りませんが、ノード単位で課金されますので、最大値を指定しても構いません。
(4) ジョブの最大予想時間を分単位で指定します。 必須ではありませんがジョブが予想外に長くなるときはジョブを中止して原因を調べた方がいいです。
(5) ジョブ名を適当に与えてください。複数のジョブを区別するときに必要になります。
(6) 標準出力のコピーを保存します。%JはJOBID(6桁の数字)に置き換えられます。
(7) 標準エラーのコピーを保存します。
(8) OpenMPのスレッド数を環境変数に設定します。(3)で指定した値を取得します。
(9) 実行コマンドを入力してください。 (3)で指定したスレッド数を環境変数を通して使用しています。
なお、プログラムに使用するスレッド数を指定する機能があるときはその方法を使用し、 (3)(8)を削除しても構いません。

3.7.2 複数ノード使用時

MPIを用いて複数ノードで計算するときのスクリプトファイルは以下の通りです。

#!/bin/bash
#SBATCH -p f024h	(1)
#SBATCH -n 80		(2)
#SBATCH -t 30		(3)
#SBATCH -J ofd		(4)
#SBATCH -o stdout.%J	(5)
#SBATCH -e stderr.%J	(6)

module load gnu/openmpi213	(7)
mpiexec -n ${SLURM_NTASKS} ./ofd_mpi_gcc data/benchmark/benchmark2.ofd	(8)
各行の意味は以下の通りです。
(1) 使用するパーティションを指定します。3.7.1を参考にしてください。
(2) 起動するプロセス数を指定します。 Fシステムは1ノード40コアなので80プロセスを指定すると2ノードを使用することになります。
(3) ジョブの最大予想時間を分単位で指定します。 必須ではありませんがジョブが予想外に長くなるときはジョブを中止して原因を調べた方がいいです。
(4) ジョブ名を適当に与えてください。複数のジョブを区別するときに必要になります。
(5) 標準出力のコピーを保存します。%JはJOBID(6桁の数字)に置き換えられます。
(6) 標準エラーのコピーを保存します。
(7) 開発時に使用したMPIのmoduleを指定します。詳しくは次章で説明します。
(8) 実行コマンドを入力してください。 (2)で指定したプロセス数を環境変数を通して使用しています。
なお、(2)を削除して引数 "-n プロセス数" でプロセス数を直接指定することも可能です。

3.8 GPUの使用方法

FシステムにはGPU(Tesla P100, 3584コア, メモリー16GB)を持ったノードが2台あります。 GPUに対応したプログラムを高速に実行することができます。

ログイン
ログインサーバーから以下のコマンドでログインしてください。
$ ssh fgpu1
なお、GPUプログラムを実行するだけのときは通常通り、以下で構いません。
$ ssh ff

CUDA
CUDAを用いてコンパイル・リンクを行うには最初にmoduleコマンドでCUDAを使用できるようにします。
$ module load cuda-8.0
以上でnvccが使用可能になりますのでコンパイル・リンクを行って実行プログラムを作成してください。。
できた実行プログラムはコマンドラインでフロントエンドサーバーのGPU (Quadro P1000, 640コア, メモリー4GB) により実行することができますので動作確認を行ってください。

CUDA+MPI
複数のノードのGPUを使用するにはCUDAとMPIを使用してプログラムを作成します。
$ module load cuda-8.0
$ module load gnu/openmpi211-cuda
Makefileには以下の変更が必要になります。

できた実行プログラムはコマンドラインでフロントエンドサーバーのGPU (Quadro P1000, 640コア, メモリー4GB) により実行することができますので動作確認を行ってください。

1GPUジョブの実行
1ノードのGPUを使用するには以下のようなスクリプトを作成しsbatchコマンドでジョブを実行してください。

#!/bin/bash
#SBATCH -p f024h_p100	(1)
#SBATCH -t 30
#SBATCH -J ofd
#SBATCH -o stdout.%J
#SBATCH -e stderr.%J

./ofd_cuda data/benchmark/benchmark2.ofd
(1) デバッグジョブのときは"f006m"としてください。6分以内なら課金されません。

複数GPUジョブの実行
複数ノードのGPUを使用するには以下のようなスクリプトを作成しsbatchコマンドでジョブを実行してください。

#!/bin/bash
#SBATCH -p f024h_p100
#SBATCH -N 2		(1)
#SBATCH --ntasks-per-node=1		(2)
#SBATCH -t 30
#SBATCH -J ofd
#SBATCH -o stdout.%J
#SBATCH -e stderr.%J

module load gnu/openmpi211-cuda		(3)
mpiexec ./ofd_cuda_mpi data/benchmark/benchmark2.ofd		(4)
(1) 2ノードで計算することを表します。
(2) 各ノードで1プロセスを起動することを表します。複数ノードのGPUを使用するために必要です。
(3) MPI実行環境をロードします。
(4) プロセス数は上で指定されていますのでここでは指定する必要はありません。

3.9 ベクトル計算機の使用方法

Vシステムにはベクトル計算機 NEC SX-Aurora TSUBASA が実装されています。
ソースコードがOpenMPによって並列化されており、かつアルゴリズムがベクトル化可能であれば、 コンパイラーの自動ベクトル化機能によってコンパイルするだけで高い性能を得ることができます。
使い方の詳細については「ユーザーズガイド」を参考にしてください。

コンパイル・リンク・実行
> ssh fvpu1 (当該マシンにloginする)
> module load PrgEnv-nec (開発環境をロードする)
> ncc -O3 -fopenmp myprog.c (コンパイル・リンク)
> ./a.out
Cコンパイラーのコマンドはnccです(C++はnc++)。 コンパイルオプションとリンクオプションは特に必要ありません。 コンパイルを行うとベクトル化と並列化に関する情報が表示されます。

1ノードジョブの実行
1ノードを使用して計算するには以下のようなスクリプトを作成しsbatchコマンドでジョブを実行してください。

#!/bin/bash
#SBATCH -p v024h	(1)
#SBATCH -t 60
#SBATCH -o stdout.%J

./a.out
(1) デバッグジョブのときは"v006m"としてください。6分以内なら課金されません。