ゲストさん、ようこそ。 ログインはこちら / Webアカウント作成手順はこちら。
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
|
28
|
29
|
30
|
31
|
1
|
2
|
3
|
|
|
|
|
|
|
|
|
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
|
|
|
|
|
|
|
|
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
|
|
|
|
|
|
|
|
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
|
|
|
|
|
|
|
|
|
25
|
26
|
27
|
28
|
29
|
30
|
1
|
|
|
|
|
|
|
|
|
XD2000 初心者ガイダンス
XD2000利用に関する基礎事項
システム構成
XD2000は、計算ノード(システムMとシステムP)、そしてストレージ(Lustreファイルシステム)から構成される。
システムMとPはそれぞれ相補的な特徴をもっている。
- システムMは、搭載されているメモリ量(128 GB)は小さいが、メモリバンド幅が強化されている。
- システムPは、メモリバンド幅は普通だが、大きなメモリ(512GB)が搭載されている

メモリが足りるのであれば、規模が大きなシステムMを使うことが推奨される (システムMは208ノード、システムPは80ノード)。
多くの計算ではメモリバンド幅(メモリとCPU間のデータ転送速度)が速度を律速しているので、システムMを使うことで実行時間の短縮が期待される。
XD2000への利用申請では、実行予定の計算に要するメモリ量を記載する必要がある。以下のページに複数のメモリ測定方法を記載しているので参考にしてほしい。
http://www.cfca.nao.ac.jp/xd2000_memorymeasurement
ファイルシステム
各ユーザには、2つの領域がLustreファイルシステム上に割り当てられている。
1つは、ユーザのホームディレクトリ(/home/ユーザ名)であり、
もう1つは、ユーザの作業用ディレクトリ(/work/ユーザ名)である。
- ホームディレクトリ(/home/ユーザ名)は、ソースコードなどを保存するための領域で、ユーザ当たりのハードリミットが625GBに設定されている(ソフトリミットは250GB)。
- 作業用ディレクトリ(/work/ユーザ名)は、計算結果を保存するための領域で、ユーザ当たりのクォタは大き目に設定されている。
ユーザの採択カテゴリ(XD-A,XD-B+,XD-B,XD-MD,XD-Trial)に応じて、ハードリミットとソフトリミットが設定される。
ディスクの使用量を確認するには、以下のコマンドを使う。
quota.sh 実行すると以下のような出力が得られる。
[beginner06@xd01 ~]$ quota.sh
===== USER:beginner06 UID:2436 Quota =====
=== /home ===
Disk quotas for prj 102436 (pid 102436):
Filesystem kbytes bquota blimit bgrace files iquota ilimit igrace
/home 44 262144000 655360000 - 11 0 0 -
=== /work ===
Disk quotas for prj 202436 (pid 202436):
Filesystem kbytes bquota blimit bgrace files iquota ilimit igrace
/work 1040 19327352832 21474836480 - 173 0 0 -
重要な項目のみ取り上げる。ファイル数に対しては制限していないので、iquota, ilimit, igraceは無視してよい。
| 項目 | 意味 | 単位 |
|---|---|---|
| Filesystem | 対象となるディレクトリ(/home or /work) | |
| kbytes | 現在使用しているディスク容量 | KB |
| bquota | ソフトリミット (超過した場合には、7日間の猶予期間の後に書き込みが制限される) | KB |
| blimit | ハードリミット (超過した場合には、書き込みが制限される) | KB |
| bgrace | ソフトリミット超過時の猶予期間 (超過した場合に猶予日数が表示される) | 日 |
プログラミング環境
プログラミング環境とは、プログラム作成とコンパイルに必要なソフトウェアの一式のことである。さらに実行性能を測定するためのソフトウェアや、各種ライブラリ(FFT, HDF5など)も含まれている。
XD2000では複数のプログラミング環境が利用できる。プログラミング環境固有の関数を使わない場合は、計算速度などを測定するベンチマークを基に選ぶとよい。
| プログラミング環境 | 読み込み | コンパイラの種類 | コンパイル コマンド |
|---|---|---|---|
| CPE |
|
Cray (デフォルト), Intel, GNU module switchで切り替え |
ftn (Fortran) cc (C言語) CC (C++) |
| Intel oneAPI |
|
Intel | mpiifx (fortran) mpiicx (c言語) mpiicpx (C++) |
Cray Programming Environment (CPE)
Crayが提供するプログラミング環境。以下のコマンドを実行するとCPE環境が有効となる(bashを想定)。
source /work/opt/local/bin/enable-cpe.sh CPE環境では、CrayとIntel・GNUの3種類のコンパイラを利用できる(Crayコンパイラがデフォルト設定)。
CrayコンパイラからGNUコンパイラへの変更
module switch PrgEnv-cray PrgEnv-gnuCrayコンパイラからIntelコンパイラへの変更
module switch PrgEnv-cray PrgEnv-intel
コンパイルコマンドは、どのコンパイラ(Cray, Intel, GNU)でも、必ず ftn (Fortran), cc (C言語), CC (C++)を使う。
Intel oneAPI
intelが提供するプログラミング環境。
以下のコマンドを実行するとIntel oneAPI環境が有効となる(bashを想定)。
source /work/opt/local/bin/enable-oneapi.sh コンパイルコマンドは、mpiifx (Fortran), mpiicx (C言語), mpiicpx (C++)を使う。
ライブラリ管理ソフトウェア module
XD2000では、moduleコマンドを使って、利用するライブラリを管理できる。
有効化しているプログラミング環境において、利用可能なライブラリの一覧は、
module avail で出力される。
ライブラリーをロードしたい場合は、以下のコマンドを実行する。
module load ライブラリ名指定したライブラリーをアンロードしたい場合は、以下のコマンドを実行する。
module unload ライブラリ名現在有効になっているライブラリやコンパイラの一覧は、以下のコマンドで確認できる。
module list ジョブ管理システム (Slurm)
XD2000のようなシステムには、CPUを搭載した多数の計算ノードがある。すべての利用者が好きなタイミングで直接計算ノードを使うと、
資源の奪い合いや処理の衝突が起こる。
そのような事態を避け、システムの効率的な利用を実現するために、Slurmなどのジョブ管理システムが導入されている。
Slurmなどのジョブ管理システムは、利用者からジョブを受け付けて、システム内の計算資源を割り当てて、適切なタイミングで実行するソフトウェアである。
利用者は、次のような情報を「ジョブ」としてジョブ管理システムに提出する。
- 実行したいプログラム
- 必要なノード数
- 必要なCPU数
- 必要なメモリ量
- 最大実行時間
ジョブ管理システムは、提出されたジョブの条件と計算ノードの空き状況を確認して、
実行のために割り当てるノードと実行のタイミングを決定する。
利用可能な計算資源
利用可能な計算資源は利用者の申請が採択されたカテゴリによって決まる。
XD2000では、利用できる計算資源が大きい方から並べると、
XD-A、XD-B+、XD-B、XD-MD、XD-Trialの5つのカテゴリが設定されている。
年2回の定期募集において、XD-AとXD-Bへの申請を受け付けている(XD-B+はXD-Aに採択されなかった方で評価の高かった方が採択される)。XD-MDとXD-Trialへの申請は随時受け付けている(XD-MDは大学院生向けのカテゴリである)。
CfCAホームページ
とHPEが提供するマニュアルには、各カテゴリにおいて、利用できる計算資源量が表としてまとまっている。
重要な量は以下の3つである。1ジョブ当たりの制限とユーザ当たりの制限の2種類がある。
これらの制限をすべて満たすジョブが実行可能である(実際に実行されるかは混雑具合に依存)。
初心者講習会午前の部では、XD-Trialに相当する計算資源が利用できる。
- 1ジョブ当たりの最大ノード数: 1 (XD-Trialの場合)
- ユーザ当たりの最大ノード数 : 1 (XD-Trialの場合)
- ユーザ当たりの同時実行ジョブ数:1 (XD-Trialの場合)
ジョブスクリプト
ユーザは、計算に必要なノード数や計算の実行時間など計算に必要な情報を記述した
スクリプトを使って、ジョブ管理システムに対してジョブを投入する。
本講習会では、Hyperthreading(HT)オフの設定を前提にする(設定方法は後述)。
- Hyperthreading(HT)とは、1つのCPUコアが2つの論理コアを提供する機能である。
XD2000では、デフォルト設定では、HTがオンになっているので、
1ノードあたり224並列まで利用可能である。 -
ただし、HTを使うと計算が遅くなる場合が多いので、オフにすることを推奨する(オフにする方法は
後程説明する)。もちろん、HTを使いたい人はデフォルト設定のままでもよい。
ジョブスクリプトの基本構造は以下のようになっている。
- ジョブ管理システムに対して計算に必要な情報の指定 (#SBATCHで始まる行)
- 追加の処理
- ジョブの実行コマンド
並列計算の種類
並列計算には、MPI並列計算、OpenMP並列計算、ハイブリッド並列計算の3種類がある。
- MPI並列計算: MPI並列計算では、計算をN個のMPIプロセスで分担して実行する。それぞれのMPIプロセスは独立したメモリ空間を使用するため、プロセス間で通信をおこないながら計算を進める。
- OpenMP並列計算: OpenMP並列計算では、1つのプロセス内でN個のスレッドを作り、計算を分担して実行する。スレッド間でメモリを共有するため、MPIのような明示的な通信は必要ない。一方、必要に応じてスレッド間で同期をおこないながら計算進める。XD2000では、OpenMP並列計算のみを利用する場合は、最大1ノードまでの利用となる。
- ハイブリッド並列計算: MPI並列計算とOpenMP並列計算を組み合わせた計算方法である。それぞれのMPIプロセスの内で、複数のOpenMPスレッドを作り、計算を分担して進める。MPIプロセス間では通信をおこない、同一MPIプロセス内のOpenMPスレッド間ではメモリを共有し計算を進める。
Slurmで使う並列計算法に関する基本用語
- task: Slurmにおけるプログラムの実行単位。MPI並列計算では、通常、1つのタスクが1つのMPIプロセスに対応する。タスク数は --ntasks で指定する。
- CPU: Slurmが各タスクに割り当てる計算資源の単位。OpenMP並列計算では、通常、1つのOpenMPスレッドに1つのCPUを割り当てる。1つのタスクに割り当てるCPU数は --cpus-per-task で指定する。
Slurmで使われる用語と、MPI/OpenMPで使われる用語のおおよその対応は以下のようになる。
| 並列計算の種類 | 一般的な用語 | Slurmでの用語 | Slurmでの設定 |
|---|---|---|---|
| MPI並列 | MPIプロセス | task | #SBATCH --ntasks=? (MPIプロセス数を指定) |
| OpenMP並列 | OpenMPスレッド | CPU | #SBATCH --ntasks=1 (タスク数を指定。OpenMP並列の場合は1) #SBATCH --cpus-per-task=? (各タスクに割り当てるCPU数を指定) export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} (環境変数としてOpenMPスレッド数を指定) |
| ハイブリッド並列 | MPIプロセス、OpenMPスレッド | task, CPU | #SBATCH --ntasks=? (タスク数を指定) #SBATCH --cpus-per-task=? (各タスクに割り当てるCPU数を指定) export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} (環境変数としてOpenMPスレッド数を指定) |
MPI並列計算を実行するためのジョブスクリプト例
XD2000でMPI並列ジョブを投入するには、以下の情報が最低限必要となる。
- 利用するパーティション
- 利用する総ノード数
- 総タスク数
- ノード当たりに要求するメモリ量: これだけノード当たりの量なので注意。
以下の例は、並列数32のMPI並列をする場合のジョブスクリプトである。必要な計算資源などの情報は、
「#SBATCH」構文を通して指定する。
(指定必須)とした項目以外は、指定がなされない場合、デフォルト値が設定される。
#!/bin/bash
#SBATCH --job-name=job0
#SBATCH --partition=partition_name # パーティション名 (指定必須, large-tなど)
#SBATCH --nodes=1 # 使用するノード数 (指定必須)
#SBATCH --ntasks=32 # タスク数 = MPIプロセス数 (指定必須)
#SBATCH --mem=10G # ノード当たりに要求するメモリ量 (指定必須)
#SBATCH --output=%j_%x.out # 標準出力 (%j:ジョブID, %x:ジョブ名)
#SBATCH --error=%j_%x.err # 標準エラー (%j:ジョブID, %x:ジョブ名)
#SBATCH --time=1:30:00 # 経過時間 [時間:分:秒]
#SBATCH --hint=nomultithread # 1コア当たり1スレッドのみ使用 (HTオフと同じ動作) (推奨)
cd ${SLURM_SUBMIT_DIR} # カレントディレクトリへの移動
module list # 有効になっているモジュールの確認
srun ./sample
さらに詳細な設定をしたい場合には、以下の項目を追加で指定することができる。
- ノード当たりのプロセス数: ノード当たりに何プロセス割り振るか。
- ソケット当たりのプロセス数: ソケット当たりに何プロセス割り振るか。
詳しくは中級講習会で説明がある。
OpenMP並列計算を実行するためのジョブスクリプト例
1ノードのみをOpenMPI並列計算で利用する場合は、計算サーバの方が適している可能性がある
(計算サーバの方がジョブ実行の継続時間が長い)。
XD2000でOpenMP並列ジョブを投入するには、以下の情報が最低限必要となる。
- 利用するパーティション
- 利用する総ノード数
- 総タスク数
- タスク当たりに割り当てるCPU数
- ノード当たりに要求するメモリ量: これだけノード当たりの量なので注意。
以下の例は、並列数32のOpenMP並列をする場合のジョブスクリプトである。必要な計算資源などの情報は、
#!/bin/bash # 使用するシェルの指定
#SBATCH --job-name=job1 # ジョブ名の指定
#SBATCH --partition=partition_name # パーティション名の指定(指定必須)
#SBATCH --nodes=1 # 使用するノード数の指定(指定必須)
#SBATCH --ntasks=1 # タスク数 (ハイブリッド並列はしないので1) (指定必須)
#SBATCH --cpus-per-task=32 # タスク当りに割り当てるCPU数 (指定必須)
#SBATCH --mem=10G # ノード当たりに要求するメモリ量 (指定必須)
#SBATCH --output=%j_%x.out # 標準出力 (%j:ジョブID, %x:ジョブ名)
#SBATCH --error=%j_%x.err # 標準エラー (%j:ジョブID, %x:ジョブ名)
#SBATCH --time=1:30:00 # 経過時間 [時間:分:秒]
#SBATCH --hint=nomultithread # 1コア当たり1スレッドのみ使用 (HTオフと同じ動作) (推奨)
cd ${SLURM_SUBMIT_DIR} # カレントディレクトリへの移動
module list # 有効になっているモジュールの確認
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} # タスク当りスレッド数の指定
./sample
XD2000において、OpenMPを使った並列計算を効率的に実行するには、CPE環境のCrayコンパイラ以外は、必ず環境変数の設定をジョブスクリプトに記述する必要がある。
設定しなくても計算は正常に実行されるが、計算が遅くなる場合があるので、注意すること。
それぞれのプログラミング環境で、OpenMPを使った並列計算を効率的に実行するための環境変数の設定は以下の通りである。
この設定は次に説明するハイブリット並列計算を行う場合にも必要である。
| プログラミング環境 | コンパイラ | 必要な環境変数設定 |
|---|---|---|
| CPE | Cray | 不要 |
| CPE | gnu |
|
| CPE | intel |
|
| intel oneAPI | intel |
|
ハイブリッド並列計算を実行するためのジョブスクリプト例
ハイブリッド並列計算を投入するためには以下の情報が必要となる。
- 利用するパーティション
- 利用する総ノード数
- 総タスク数
- タスク当たりに割り当てるCPU数
- ノード当たりに要求するメモリ量: これだけノード当たりの量なので注意。
以下の例は、MPI並列数2、OpenMP並列数32のハイブリッド並列をする場合のジョブスクリプトである。
#!/bin/bash # 使用するシェルの指定
#SBATCH --job-name=job1 # ジョブ名の指定
#SBATCH --partition=partition_name # パーティション名の指定(指定必須)
#SBATCH --nodes=1 # 使用するノード数の指定(指定必須)
#SBATCH --ntasks=2 # タスク数 (ハイブリッド並列はしないので1) (指定必須)
#SBATCH --cpus-per-task=32 # タスク当りに割り当てるCPU数 (指定必須)
#SBATCH --mem=10G # ノード当たりに要求するメモリ量 (指定必須)
#SBATCH --output=%j_%x.out # 標準出力 (%j:ジョブID, %x:ジョブ名)
#SBATCH --error=%j_%x.err # 標準エラー (%j:ジョブID, %x:ジョブ名)
#SBATCH --time=1:30:00 # 経過時間 [時間:分:秒]
#SBATCH --hint=nomultithread # 1コア当たり1スレッドのみ使用 (HTオフと同じ動作) (推奨)
cd ${SLURM_SUBMIT_DIR} # カレントディレクトリへの移動
module list # 有効になっているモジュールの確認
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} # タスク当りスレッド数の指定
srun -c${OMP_NUM_THREADS} ./sample
ノードの割り当て
XD2000では、1ノードを超えるノード数を使うジョブは、割り当てられたノードを占有する。
1ノードで収まるジョブは、他のジョブと同じノードを共有する。
メモリ使用量の設定
ジョブスクリプトにおいて、ノード当たりに要求するメモリ量を指定する必要がある。
メモリ量の指定は、ジョブスクリプトの中で、"#SBATCH --mem=?"のように指定する(単位はGB)。
テストジョブを実行して、ジョブが使用しているメモリ量を確認することができる。
Slurmのリソース監視機能を使うと、ジョブが使用したメモリ量を確認できるので、実習時に試してみよう。
詳しくは、Slurmのリソース監視機能を使ったメモリ使用量の確認法を参照すること。
メモリ量の上限は、システムMにおいて115GB、システムPにおいて461GBである。
これを超えるメモリ量を指定すると、ジョブは投入されない。
指定するメモリ量は、使うノード数に依存する。
- 1ノードを超えるノードを使う場合には、ノードが占有されるので、上限の値を指定すればよい。
- 1ノードのみを使う場合には、測定したメモリ使用量に応じて、必要なメモリ量を指定する必要がある。
ギリギリのメモリ量を指定すると、ジョブが途中でメモリ不足で落ちる可能性があるので、
20%や50%程度余裕を持ったメモリ量を指定することが推奨される。
メモリ値は整数で指定するので、小数点以下を切り上げて整数値にすることが推奨される。
実行時間の調整
各キューには最大実行時間が設定されている。ジョブスクリプトの中で、"#SBATCH --time=?"のように指定できる(単位は[時間:分:秒])。
指定がない場合には、各キューの最大実行時間が自動的に設定される。
XD2000では、資源を有効活用するためにBackfill方式(大規模ジョブの計算開始時間に影響を与えない範囲内で、
小規模ジョブの実行を早める)を採用している。
大規模ジョブが計算開始する前には、必要な数のノードが空くまで待つので、
空きノードが多くなる傾向がある。
大規模ジョブの計算開始時刻までに終了しないジョブは計算開始されないが、
実行時間を短めに設定することで、うまく空きノードに割り当てられる可能性がある。
ただし、実際の待ち時間が実行時間に比例するとは限らないので、依存性をもったジョブを複数投入している場合、実行時間を短くしすぎると、トータルの計算時間が長くなることがあるので注意すること。
ログインノードでの環境とジョブ実行時の環境
ログインノードで選択したプログラム環境やロードしたモジュールは、
ジョブ実行時の環境に引き継がれる。
ジョブスクリプトの中で、moduleコマンドを使ってモジュールをロードすることもできるが、
ログインノードでビルドしたプログラムが、ジョブ実行時に計算ノードで正しく動作するためには、
ログインノードでロードしたモジュールと同じモジュールをロードすることが推奨される。
Slurmコマンド
ここでは代表的なSlurmコマンドを紹介する。詳細は、HPEが提供するマニュアルを参照すること。
- ジョブの投入: sbatch
sbatch job_script.shジョブを投入するとIDが返ってくるので、ジョブの状態確認や削除の際に利用する。
制限時間内に計算が終わらない場合は、ジョブを連結して(依存性を付与して)投入する必要がある。
先頭のジョブはsbatchで投入し、2つ目以降のジョブは、
直前ジョブのジョブIDを指定して、依存性を付与して連続して投入する。
sbatch --dependency=afterany:job_id job_script.sh- 自分が投入したジョブの状態を表示
squeue --me - 自分が投入したジョブの予想開始時間を確認
squeue --me --startただし、表示される開始時間はあくまで予想であり、実際の開始時間とは異なる場合があることに注意。
- 投入されている全ジョブの一覧を表示
squeue
scancel ジョブIDscontrol show job ジョブIDジョブを投入した後で、投入したジョブスクリプトの中身を確認するには、以下のコマンドを実行する。
scontrol write batch_script ジョブIDジョブスクリプトが別ファイルとして保存される。
実習
XD2000利用者に関係するCfCA共同利用計算機のネットワーク構成概念図
実習に入る前に、
CfCAが運用する機材の中で、XD2000利用者に直接関係する機材がどのようにつながっているかを理解しておく必要がある。
以下の図は、XD2000利用者に直接関係する機材を抜き出した概念図である。他には計算サーバとGPUクラスタを運用している。

XD2000を含めたCfCA共同利用計算機に接続するためには、まずVPN(Virtial Private Network)接続が必要になる。
VPNとは、インターネット上に暗号化した通信経路を作る技術である。
VPN接続することで、インターネット上のどこからでも、あたかもCfCAのネットワーク内にいるかのようにアクセスできる。
| 機材 | ログイン | 説明 |
|---|---|---|
| ログインノード (Login Nodes) |
可 |
XD2000利用者がログインし、 プログラムの作成やコンパイル、ジョブの投入などを行う場所。計算の直接実行は禁止。 |
| ファイル転送サーバ (File Transfer Servers) |
可 | ファイルを転送するためのサーバ。太い回線(100Gbps)でつながっている。 |
| 計算ノード (Computing Nodes) |
不可 |
XD2000の本体。計算を実行するためのノード。システムMは208ノード、 システムPは80ノードで構成されている。 |
| Lustreファイルシステム | 不可 |
計算データを保存するための領域。 home領域とwork領域が設置され、ログインノードとファイル転送サーバから/homeと/workとしてアクセス可能である。 work領域は解析サーバから/xd-workとしてアクセス可能(書き込み禁止)である。 |
| 解析サーバ (Analysis Servers) |
可 |
XD2000で実行した計算の結果の解析や可視化を行うための計算機。 巨大なデータの解析ができるように、1TBのメモリを搭載している。 an09.cfca.nao.ac.jpからan14.cfca.nao.ac.jpまでの6台のノードを運用している。 |
| ファイルサーバ (File Severs) |
不可 |
計算データを長期保存するための領域。 解析サーバからアクセス可能である。利用には別途申請が必要 |
MPI並列ジョブの実行と結果の可視化
VPN接続から、XD2000でのシミュレーションの実行、解析サーバでの可視化までの
一連の作業をやってみよう。
接続方法
詳しくはこちらを参照。
- VPN接続
手元のマシンにおいて、Forti-ClientでVPN接続する。
パスワードは「VPNパスワード」を使う。登録されたメールアドレスに送付されたトークンを入力する。
- XD2000へのssh接続
ssh -Y -l username xd01.cfca.nao.ac.jpまたは
ssh -Y -l username xd02.cfca.nao.ac.jpパスワードは「SSHパスワード」を使う。
パスワード変更
初回ログイン時に、passwdコマンドを使ってパスワードを必ず変更する。
passwd 入力している最中に、画面上には「●」や「*」などは表示されないので注意すること。
このとき、以下の自然科学研究機構の情報セキュリティ対策基準に準拠しない場合、パスワード変更は拒否される。
- 記号,英小文字,英大文字,数字のうちから2種類以上を組み合わせること。
- 12文字以上の長さ又はこれと同等以上の複雑さを有すること。(パスワード長は,できるだけ長い方が良い。)
- また,自己から推定できる文字列,辞書等に掲載される文字列の組み合せ,文字と数字の置き換え等,探索・推定が容易でないこと。
プログラム環境設定@XD2000
XD2000へログインしたら、まずどのプログラム環境を使うのかを指定する必要がある。
実習ではCPE環境のGNUコンパイラを使う。余裕があれば他のコンパイラ(Crayとintel)やoneAPI環境も試してみよう。
- CPE環境の有効化
source /work/opt/local/bin/enable-cpe.sh - Crayコンパイラ(デフォルト設定)からGNUコンパイラへの変更
module switch PrgEnv-cray PrgEnv-gnu - 環境を確認する。
module list以下のように表示されれば、CPE環境のGNUコンパイラが有効化されている。
[beginner06@xd01 xd2000lecture]$ module list Currently Loaded Modulefiles: 1) craype-x86-skylake 4) perftools-base/24.03.0 7) cray-mpich/8.1.29 2) libfabric/1.13.1 5) gcc-native/12.2 8) cray-libsci/24.03.0 3) craype-network-ofi 6) craype/2.7.31 9) PrgEnv-gnu/8.4.0
サンプルプログラムのダウンロードとコンパイル
今回はCfCAが提供している2次元流体のサンプルコードを使って実習を行う。
デフォルト設定では、256x256の格子で、Kelvin-Helmholtz不安定性を計算する。計算結果は、40ステップ目までのスナップショットが出力される。
- 作業用ディレクトリへの移動
cd /work/username「username」は自身のユーザ名に置き換えること。
git clone https://github.com/cfcanaoj/xd2000samples.git cd xd2000samples/xd2000lecture make mpi実行ファイルkh_mpi.xが生成される。
MPI並列計算ジョブの投入
MPI並列計算では、8プロセスで計算を行う。
計算領域全体をx方向に8分割する。つまり各プロセスは32x256の計算領域を担当する。
計算領域全体のグリッド数や、並列数を変更したい場合は、
ソースコードmain_mpi.f90の中のngridxとngridyの値を適宜変更すること。
- ジョブスクリプトの内容を確認
まずはMPIによる並列計算を実行する。slm_mpi.sh が対応するジョブスクリプトである。
中身を確認するには以下のコマンドを実行する。cat slm_mpi.sh以下のジョブスクリプトでは、MPIプロセス数を8に指定している。
変更する場合は、ソースコードを変更する必要がある。#!/bin/bash #SBATCH --job-name=KHmpi #SBATCH --partition=M-large-t #SBATCH --nodes=1 #SBATCH --ntasks=8 #SBATCH --mem=1G #SBATCH --output=%j_%x.out #SBATCH --error=%j_%x.out #SBATCH --time=00:15:00 #SBATCH --hint=nomultithread #SBATCH --mail-type=BEGIN,END,FAIL #SBATCH --mail-user=yourmailaddress #SBATCH --reservation=beginner export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} cd ${SLURM_SUBMIT_DIR} module list srun ./kh_mpi.xここで、「#SBATCH --reservation=beginner」は、XD2000講習会で占有しているノードを使うためのオプションである。
通常利用で載せると、ジョブが走らないので注意すること(
squeue --meコマンドのNODELIST(REASON)の欄に、"Reservation"と表示される)。ジョブの状態をメールで通知できる。ジョブの開始、終了、異常終了時にメールを送付するには、
「#SBATCH --mail-type=BEGIN,END,FAIL」をジョブスクリプトに挿入し、「#SBATCH --mail-user=?」で自分のメールアドレスを指定する。
いまは、暫定的にyourmailaddressになっているので、これを正しいアドレスに変更する。sed -i "s/yourmailaddress/あなたのメールアドレス/" slm_*.shを実行する。
slm_mpi.sh以外のジョブスクリプトにおいても変更をしたいので、「slm_*.sh」にしている。
「あなたのメールアドレス」には指定するメールアドレスを入れる。
「yourmailaddress」が「あなたのメールアドレス」に置き換わる。エディタが使える人は直接編集しても構わない。
catコマンドで、変更できているか確認する。
- ジョブの投入
sbatch slm_mpi.sh - ジョブの状態の確認
squeue --me以下のような表示が出る。ジョブの状態を確認できる。
以下の例では、ジョブIDが305932、パーティション名がM-large-t、ジョブ名がKH、ユーザ名がbeginner、ジョブの状態がR(実行中)、経過時間が1分29秒、使用ノード数が1、使用ノード名がcna048であることがわかる。[beginner06@xd01 xd2000lecture]$ squeue --me JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 305932 M-large-t KH beginner R 1:29 1 cna048JOBID: ジョブID、PARTITION: パーティション名(今回はM-large-t)、NAME: ジョブ名、USER: ユーザ名、ST: ジョブの状態(R: 実行中, PD: 待機中)、TIME: 経過時間、NODES: 使用ノード数、NODELIST(REASON): 使用ノード名(待機中の場合は理由)が表示される。
- 計算の途中経過の確認
ジョブスクリプトの中で、標準出力と標準エラーの出力先を指定しているので、ジョブが実行されている間に、計算の途中経過を確認することができる。
今回は、%j_%x.outに標準出力、%j_%x.errに標準エラーが出力される。
もし、ジョブIDが305932でジョブ名がKHmpiの場合は、
305932_KHmpi.outと305932_KHmpi.errが出力されるので、tailコマンドで確認してみよう。tail -f (ジョブID)_KHmpi.out(ジョブID)は、実際に投入したジョブのIDに置き換えること。
- メモリ使用量の確認
seff jobIDjobIDは、実際に投入したジョブのIDに置き換えること。
上で実行したジョブの情報は以下のように確認できる。この2次元計算に要するメモリ量は非常に少ない。
[beginner06@xd01 xd2000lecture]$ seff 305932 Job ID: 305932 Cluster: xd2000 User/Group: beginner06/user State: COMPLETED (exit code 0) Nodes: 1 Cores per node: 8 CPU Utilized: 00:05:57 CPU Efficiency: 92.97% of 00:06:24 core-walltime Job Wall-clock time: 00:00:48 Memory Utilized: 84.38 MB (estimated maximum) Memory Efficiency: 8.24% of 1.00 GB (1.00 GB/node)
解析サーバでの可視化
- 解析サーバへの接続
ssh -Y -l username an09.cfca.nao.ac.jpssh -Y -l username an10.cfca.nao.ac.jpssh -Y -l username an11.cfca.nao.ac.jpssh -Y -l username an12.cfca.nao.ac.jpssh -Y -l username an13.cfca.nao.ac.jpssh -Y -l username an14.cfca.nao.ac.jpどのノードに接続してもよい。
- XD2000のwork領域の確認
XD2000のwork領域は、解析サーバにおいて/xd-workにマウントしている。lsコマンドで確認してみよう。
XD2000のwork領域に置いたファイルが参照できる。書き込みは禁止されている。
ls /xd-work/$USER/xd2000samples/xd2000lecture
rsync -avz /xd-work/$USER/xd2000samples .
cd xd2000samples/xd2000lecture python3 MakePlot.py snapshots_mpi 40
snapshots_mpiディレクトリにある、40ステップ目の計算結果の可視化画像が指定したディレクトリ下のimagesディレクトリに作られる。
同時に画面上にも表示される。表示されない場合は、X11転送が有効になっているか確認すること。
手元のマシンへのデータ転送
計算結果を手元のマシンに転送するには、scpコマンドまたはrsyncコマンドを使用する。
データ転送にはデータ転送サーバを使う。データ転送サーバにも/work領域がマウントされているので、XD2000のwork領域に置いたファイルを転送することができる。
rsync -avz -e ssh (ユーザ名)@xdnft01.cfca.nao.ac.jp:/work/(ユーザ名)/xd2000samples (転送先のディレクトリ)
手元のマシンのカレントディレクトリに転送したい場合は、「(転送先のディレクトリ)」をピリオド「.」にする。
可視化したファイルは解析サーバにある。
解析サーバから転送する場合は、以下のコマンドを実行する。
rsync -avz -e ssh (ユーザ名)@an10.cfca.nao.ac.jp:xd2000samples (転送先のディレクトリ)
OpenMP並列計算ジョブの実行
- コンパイル
make openmp実行ファイルkh_openmp.xが生成される。
- ジョブスクリプトの内容を確認
まずはOpenMPによる並列計算を実行する。slm_openmp.sh が対応するジョブスクリプトである。
中身を確認するには以下のコマンドを実行する。cat slm_openmp.sh16スレッドで計算を行うように指定している。OpenMPの並列数を変更する際に、ソースコードを変更する必要はない。
#!/bin/bash #SBATCH --job-name=KHomp #SBATCH --partition=M-large-t #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=16 #SBATCH --mem=1G #SBATCH --output=%j_%x.out #SBATCH --error=%j_%x.out #SBATCH --time=00:15:00 #SBATCH --hint=nomultithread #SBATCH --mail-type=BEGIN,END,FAIL #SBATCH --mail-user=yourmailaddress #SBATCH --reservation=beginner cd ${SLURM_SUBMIT_DIR} module list echo $SLURM_CPUS_PER_TASK export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} export OMP_PROC_BIND=true export OMP_PLACES=cores ./kh_openmp.x - ジョブの投入
sbatch slm_openmp.sh - ジョブの状態の確認
squeue --me
ハイブリッド並列計算ジョブの実行
- コンパイル
make hybrid実行ファイルkh_hybrid.xが生成される。
- ジョブスクリプトの内容を確認
slm_hybrid.sh が対応するジョブスクリプトである。
中身を確認するには以下のコマンドを実行する。cat slm_hybrid.sh以下のジョブスクリプトでは、MPIプロセス数を8、OpenMPスレッド数を2に指定している。
それぞれのMPIプロセスに、OpenMPスレッドを2つ割り当てる。
つまり、MPIプロセス数8 x OpenMPスレッド数2 = 16コアを使うことになる。
MPIプロセス数を変更する場合は、ソースコードを変更する必要がある。#!/bin/bash #SBATCH --job-name=KHhyd #SBATCH --partition=M-large-t #SBATCH --nodes=1 #SBATCH --ntasks=8 #SBATCH --cpus-per-task=2 #SBATCH --mem=1G #SBATCH --output=%j_%x.out #SBATCH --error=%j_%x.out #SBATCH --time=00:15:00 #SBATCH --hint=nomultithread #SBATCH --mail-type=BEGIN,END,FAIL #SBATCH --mail-user=yourmailaddress #SBATCH --reservation=beginner cd ${SLURM_SUBMIT_DIR} module list echo $SLURM_CPUS_PER_TASK export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK} # gnu in CPE export OMP_PROC_BIND=True export OMP_PLACES=cores srun -c${SLURM_CPUS_PER_TASK} ./kh_hybrid.x - ジョブの投入
sbatch slm_hybrid.sh - ジョブの状態の確認
squeue --me