実行したジョブの情報(経過時間やメモリ使用量)を取得したい
SQUIDでは、acstatコマンドを使って過去に実行したジョブの経過時間を取得可能です。メモリ使用量については取得できませんので、以下のお問い合わせフォームからご連絡くださいませ。
OCTOPUSについては、経過時間・メモリ使用量ともに取得できません。同じく、以下のお問い合わせフォームからご連絡くださいませ。
お問い合わせフォーム
SQUIDでは、acstatコマンドを使って過去に実行したジョブの経過時間を取得可能です。メモリ使用量については取得できませんので、以下のお問い合わせフォームからご連絡くださいませ。
OCTOPUSについては、経過時間・メモリ使用量ともに取得できません。同じく、以下のお問い合わせフォームからご連絡くださいませ。
お問い合わせフォーム
OpenMPIについては独自にインストールしてご利用することが可能です。
MPIのパスを記載したmoduleファイルを作成してください。
1 2 3 4 5 6 7 8 9 10 11 12 |
#%Module 1.0 # # OMP-sample # proc ModulesHelp { } { puts stderr "OMP-sample\n" } prepend-path PATH /sqfs/work/(MPIインストール先)/bin prepend-path LD_LIBRARY_PATH /sqfs/work/(MPIインストール先)//lib/ setenv MPI_ROOT /sqfs/work/(MPIインストール先)/ |
ジョブスクリプトの中で以下のようにmoduleファイル指定してください。
1 2 |
#PBS -T openmpi #PBS -v NQSV_MPI_MODULE=moduleファイルへの(フルパス) |
比較的簡単に実施できる方法を2点ご紹介いたします。
ブラウザで共有したファイルを確認・操作いただく場合は、ONION-fileを併用する(1)の手順となります。
S3コマンドで共有したファイルを確認・操作いただく場合は(2)の手順となります。(1)と(2)は併用可能です。
本エラーは、書式なしの入出力文の並びに配列が指定されており、その配列サイズが大きい場合に発生するエラーです。
以下のコンパイラオプション、実行時環境変数を指定して実行いただくことで特定可能です。
★のように、エラーの出たファイルと行数が表示されます。
例)
$ nfort main.f90 -g -traceback=verbose
$ export VE_TRACEBACK=VERBOSE
$ ./a.out
Runtime Error: Cannot allocate memory for environment variable VE_FORT_UFMTENDIAN.
Program terminated by fatal error
[ 0] 0x600c00a58910 ? ?:?
[ 1] 0x600c00a51b38 ? ?:?
[ 2] 0x600c00cd4c78 ? ?:?
[ 3] 0x60000001f850 MAIN main.f90:28 ★
[ 4] 0x60000001fc80 ? ?:?
[ 5] 0x600c02a407a8 ? ?:?
[ 6] 0x600000002d00 ? ?:?
wandbについてはpipコマンドにてインストール可能です。
pip install wandb
wandb login "XXXX"
SQUIDでは原則計算ノードからのインターネットアクセスを許可しておりませんが、wandbに限定して許可しています。
以下のようにジョブスクリプトを記述してください。
#!/bin/bash
#PBS -q SQUID
#PBS --group=[グループ名]
#PBS -l elapstim_req=1:00:00
cd $PBS_O_WORKDIR
export http_proxy="http://ibgw1f-ib0:3128"
export https_proxy="https://ibgw1f-ib0:3128"
python test.py
requests-2.24を使用してください。2.26等のバージョンについては、SQUIDで正常に動作しません。
SQUIDでは環境変数 $NQSII_MPIOPTS / $NQSV_MPIOPTによって、#PBS -l cpunum_jobで指定した値を元に、machinefileを自動生成しMPIに設定しています。ppn, rr, prehostといったオプションはmachinefileと同時に指定することが出来ないため、仮に128 MPIプロセス / 1ノードあたり64プロセス割り当てることを想定し、以下のように指定したとしても、ppn オプションは無効となります。
mpirun ${NQSV_MPIOPTS} -np 128 -ppn 64 ./a.out
基本的には以下のように指定いただくことで、128 MPIプロセスを生成し、1ノードあたり64プロセス割り当てることが可能です。
#PBS -l cpunum_job=64
(中略)
mpirun ${NQSV_MPIOPTS} -np 128 ./a.out
環境変数 $NQSV_MPIOPTS は、以下のオプションとファイルが指定されています。
-machinefile /var/opt/nec/nqsv/jsv/jobfile/[リクエストID等の数値]/mpinodes
mpinodesファイルはマシンファイルとなっており、上記の場合は以下のようなホスト名、コア数が指定されています。
host001:64
host002:64
ただし、より細かくプロセス配置を指定したい場合(例えばピニングを設定し特定のコアにプロセスを使用せずに計算する場合など)上記のオプションでは対応出来ないケースがあります。ppn, rr, prehostオプションを使用する場合は、環境変数 $NQSII_MPIOPTS / $NQSV_MPIOPT を指定する代わりにhostfileオプションと環境変数 $PBS_NODEFILE を指定してください。128 MPIプロセスを生成し、1ノードあたり64プロセス割り当てる場合は以下のように指定します。
mpirun -hostfile ${PBS_NODEFILE} -np 128 -ppn 64 ./a.out
※PBS_NODEFILEを使う場合、#PBS -l cpunum_jobで指定した値がMPIに設定されません。ご自身でプロセス数の確認をお願いします。また、OCTOPUSではご利用いただけません。
以下のコマンドで取得可能です。ジョブスクリプトの最後で実行してください。
$ nvidia-smi --query-accounted-apps=timestamp,gpu_name,gpu_bus_id,gpu_serial,gpu_uuid,vgpu_instance,pid,time,gpu_util,mem_util,max_memory_usage --format=csv
出力例は以下のとおりです。最後に記載されている523MiBがGPUで使用した最大メモリサイズです。
2021/11/24 19:26:26.333, A100-SXM4-40GB, 00000000:27:00.0, 1564720026417, GPU-a3b25bed-7bb1-cbd8-89e3-3f14b6118874, N/A, 761279, 117202 ms, 2 %, 0 %, 523 MiB
ジョブクラス「SQUID-S」を使用している場合は、同じノード内で別の方のジョブが実行されている場合があるため、正しい値が取得されない可能性があります。予めご了承ください。
2段階認証コードのリセットには管理者の操作が必要となりますので、お問い合わせフォームからお知らせください。その際、氏名、利用者番号、メールアドレスは登録時のものを記入してください。2段階認証のリセット時にパスワードもあわせて初期化いたしますので、予めご了承ください。
お問い合わせフォーム
アカウントの所有者が卒業してしまった等、本人からの連絡が難しい場合に限り、当該アカウントに登録されている指導教員またはグループの申請代表者からの2段階認証リセットの依頼にも対応します。
ご自身でインストールすることで、利用可能です。手順は以下のとおりです。
インストール手順
1 2 3 4 5 6 7 8 9 10 11 12 |
# Python+GPUのEnvironmental modulesを設定する module load BasePy module --force switch python3/3.6 python3/3.6.GPU module load BaseGPU module load cudnn/8.2.0.53 #Pytorchをインストールする仮想環境 test-envを作成し、Activateする python3 -m venv /sqfs/work/【グループ名】/【ユーザ名】/test-env/ source /sqfs/work/【グループ名】/【ユーザ名】/test-env/bin/activate # SQUIDのGPUノード(A100)に対応するCUDA11.1 + Pytorchをインストール pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html |
利用手順(ジョブスクリプト例)
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash #PBS -q SQUID #PBS --group=(グループ名) #PBS -l elapstim_req=1:00:00,gpunum_job=8 cd $PBS_O_WORKDIR module load BasePy module --force switch python3/3.6 python3/3.6.GPU module load BaseGPU module load cudnn/8.2.0.53 source /sqfs/work/【グループ名】/【ユーザ名】/test-env/bin/activate python test.py |
インストール手順
1 2 3 4 5 6 7 8 9 10 |
# Anaconda仮想環境の作成準備 conda config --add envs_dirs /sqfs/work/(グループ名)/(利用者番号)/conda_env conda config --add pkgs_dirs /sqfs/work/(グループ名)/(利用者番号)/conda_pkg #Pytorchをインストールする仮想環境 test-envを作成し、Activateする conda create --name test-env python=3.8 conda activate test-env # SQUIDのGPUノード(A100)に対応するCUDA11.1 + Pytorchをインストール conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge |
利用手順(ジョブスクリプト例)
1 2 3 4 5 6 7 |
#!/bin/bash #PBS -q SQUID #PBS --group=(グループ名) #PBS -l elapstim_req=1:00:00,gpunum_job=8 cd $PBS_O_WORKDIR conda activate test-env python test.py |
ワークフローにてA⇒Bの順序で制御しているときに、AがRERUNとなった場合、Aを再実行、Bは再スケジューリングされ、ワークフローの順番を保ったまま実行されます。
ベクトルノード群の場合、実行時に以下の環境変数を指定いただくことでNaNを含む無効演算例外を検知することが可能です。
(NaNを演算に使用されるとエラーとなります。)
export VE_FPE_ENABLE=INV
詳細は、以下のマニュアル 6ページ「1.9 演算例外」の項目をご参照ください。
SX-Aurora TSUBASA Fortran コンパイラ ユーザーズガイド
また、エラーを検知した該当箇所を確認する場合は以下も合わせてご指定ください。
コンパイラオプション:-traceback=verbose -g
実行時環境変数:export VE_TRACEBACK=VERBOSE
詳細は上記マニュアルの24ページに記載しております。
qstatコマンドを実行すると、SX-Aurora TSUBASA(ベクトルエンジン)が接続されているLinux(ベクトルホスト)のCPU時間や使用メモリが表示されます。SX-Aurora TSUBASA(ベクトルエンジン)の情報を確認する場合は以下のオプションを指定してください。
1 2 3 4 5 6 7 8 9 10 11 |
$ qstat -J -e #実行結果例 JNO RequestID EJID VEMemory VECPU JSVNO VectorIsland UserName Exit ---- --------------- ----- -------- -------- ----- --------------- -------- ---- 0 1000.sqd 896040 10.38G 147578.00 4100 vec0100 user01 - 0 1001.sqd 129054 20.45G 15251.00 4101 vec0101 user01 - 0 1002.sqd 2138470 21.35G 5668.00 4102 vec0102 user01 - 1 1002.sqd 2138455 21.35G 6503.00 4102 vec0102 user01 - 0 1003.sqd 1813977 21.54G 33667.00 4103 vec0103 user01 - 1 1003.sqd 1814130 21.54G 32972.00 4103 vec0103 user01 - |
1行に出力される情報は、投入するジョブクラスによって異なります。
DBGやSQUID-Sに投入した場合:ベクトルエンジン1台分の使用メモリ量、CPU時間を表示します
SQUIDやSQUID-Hに投入した場合:ベクトルエンジン8台分の使用メモリ量、CPU時間を表示します
SX-ACEでは標準で出力されていましたが、SX-Aurora TSUBASAではコンパイル時および実行時にオプションを設定する必要があります。
コンパイラオプションでproginfオプションを指定してください。
nfort -proginf test.f90
また、ジョブスクリプトで以下を指定してください。
export VE_PROGINF=YES
または
export VE_PROGINF=DETAIL
HPCI以外のグループからHPCI共用ストレージをマウントしたい / 阪大を利用しないHPCI課題で採択されたHPCI共用ストレージをマウントしたい場合、以下のような手順となります。事前に、マウントポイントを用意する必要がありますので、こちらからお問い合わせください。
1. HPCI 証明書発行システムで代理証明書を発行し、リポジトリに格納します。
2. フロントエンドサーバにログイン後、次のコマンドを実行し、代理証明書をダウンロードしてください。
myproxy-logon -s portal.hpci.nii.ac.jp -l hpciXXXX(HPCI-ID) -t168
3. 次のコマンドを実行し、HPCI共用ストレージを「/gfarm/(project ID)/(user ID)」(マウントポイント)にマウントします。
mount.hpci
4. 利用を終了次第、HPCI共用ストレージをアンマウントします。
umount.hpci
HPCI共用ストレージについては、こちらのHPCI共用ストレージ利用マニュアルをご参照ください。
ファイル名に連続した数値が含まれている場合、パラメトリックジョブという投入方法で、一度に大量のジョブを投入できます。
パラメトリックジョブでは、ジョブスクリプト内の"$PBS_SUBREQNO"環境変数に、-tで指定した数値(下記の例では1から5までの数値)が格納されます。
qsubすると同時に5本のジョブが投入され、a.outに対してそれぞれ異なる入力ファイル(下記の例ではinput1からinput5)が設定されます。
ジョブスクリプト例
1 2 3 4 |
#PBS -q OCTOPUS #PBS -l elapstim_req=0:30:00,cpunum_job=24 cd $PBS_O_WORKDIR ./a.out input$PBS_SUBREQNO |
投入例
1 2 |
qsub -t 1-5 jobscript.sh |
qstatの表示例:パラメトリックジョブの場合、1回のqsubにつき1件分の表示となります
1 2 3 4 |
RequestID ReqName UserName Queue Pri STT S Memory CPU Elapse R H M Jobs --------------- -------- -------- -------- ---- --- - -------- -------- -------- - - - ---- 123456[].oct nqs username OC1C 0 QUE - - - - Y Y Y 1 |
sstatの表示例:-tで指定した数値分だけ表示されます
1 2 3 4 5 6 7 8 |
RequestID ReqName UserName Queue Pri STT PlannedStartTime --------------- -------- -------- -------- ----------------- --- ------------------- 123456[1].oct nqs username OC1C 0.5002/ 0.5002 QUE - 123456[2].oct nqs username OC1C 0.5002/ 0.5002 QUE - 123456[3].oct nqs username OC1C 0.5002/ 0.5002 QUE - 123456[4].oct nqs username OC1C 0.5002/ 0.5002 QUE - 123456[5].oct nqs username OC1C 0.5002/ 0.5002 QUE - |
OCTOPUSには以下のGnuplotがインストールされています。
Octaveから呼び出されるGnuplotのバージョンは、以下の2通りの方法で指定が可能です。
・呼び出したいバージョンのパスを設定する
1 2 3 4 5 6 |
#!/bin/bash #PBS -q OCTOPUS #PBS -l elapstim_req=1:00:00 export PATH=/octfs/apl/Gnuplot/5.2.4/bin:$PATH cd $PBS_O_WORKDIR /octfs/apl/Octave/5.1.0/bin/octave-5.1.0 file.m |
・Octaveの設定ファイル「.octaverc」を作成する
gnuplot_binary="[Gnuplotの実行ファイルのパス]"
上記のように記述することで、Octaveから呼び出されるデフォルトのGnuplotの実行ファイルを設定できます。
例えば、5.2.4を呼び出す場合は「gnuplot_binary="/octfs/apl/Gnuplot/5.2.4/bin"」と記述してください。
MPIプログラム実行時に${NQSII_MPIOPTS}を指定していなかった場合、以下のようなエラーが出力されます。
[mpiexec@oct-***] HYDT_bscd_pbs_query_node_list (../../tools/bootstrap/external/pbs_query_node_list.c:23): No PBS nodefile found
[mpiexec@oct-***] HYDT_bsci_query_node_list (../../tools/bootstrap/src/bsci_query_node_list.c:19): RMK returned error while querying node list
[mpiexec@oct-***] main (../../ui/mpich/mpiexec.c:621): unable to query the RMK for a node list
以下のページに、MPIプログラムを実行する際のジョブスクリプトの例を掲載しておりますので、まずご参照ください。
OCTOPUSでのintel MPI実行方法
エラーメッセージ自体は、MPIプログラムの"nodefile"(実行する計算ノードを指定する設定ファイル)が存在しないことを通知しています。OCTOPUSでは、${NQSII_MPIOPTS}を指定いただくことで、自動的に設定されます。
資源に空きがある限り、複数のジョブを同時に実行可能です。
qsub A.nqs
qsub B.nqs
といったように、1件1件個別にqsubしていくことで、A.nqsとB.nqsが同時に実行可能な状態となります。
MPI並列実行を行うプログラムで各プロセスが同名ファイルにデータを出力するよう記述していると、バイナリが書き込まれてしまう場合があります。
大規模計算機システムのような共有ファイルシステムにおいて各プロセスが同名のファイルにデータを出力することは、各プロセスが同一のファイルにデータを出力することと同じであるため、プロセス間で競合が発生した際にデータが破損してしまい、バイナリデータが書き込まれてしまうことがあります。各プロセスごとに別名のファイルに出力するか、MPI-IOというMPI用の入出力インターフェースを利用することで、プロセス間の競合を防ぐことが可能です。
MPI-IOについては下記をご覧ください。
MPIの実行結果を1つのファイルに出力したい
利用者単位、計算機単位でジョブの投入数上限を設定しており、いずれかの上限を超過していることによるエラーとなります。
基本的には、誤った利用方法による事故を防ぐ目的で設定しているものであり、利用を阻害するために設けているものではありませんので、本エラーを確認された場合は、以下までお知らせください。
お問い合わせフォーム
XQuartsの仕様変更により、Xwindowを使用する場合に正しく起動しないことがあります。
1. MacOS の xterm 上で以下のコマンドを実行してください。
XQuarts 2.7.10 以降で、iglx が標準で使えなくなったため、以下のコマンドを実行しないとエラーが出力されます。
$ defaults write org.macosforge.xquartz.X11 enable_iglx -bool true
2. SSH の X 転送を早くするチューニングを実施してください。
JavaFX使用する一部のアプリケーションでは、上記設定にて若干挙動が軽くなる可能性があります。
<.ssh/config 設定例>
Host *
Compression yes
ForwardX11 yes
Ciphers blowfish-cbc,arcfour
接続を行っている端末のターミナルソフトがフロントエンドサーバ接続時に環境変数を引き継ぐように設定している場合、このメッセージが表示されます。以下の2通りの方法をお試しください。
自身の使用しているターミナル上の/etc/ssh_configファイルの"SendEnv"の記述を下記のようにコメントアウトしてください。
※フロントエンドに接続していない状態で行ってください。
Host *
# SendEnv LANG LC_*
profileファイルに下記のように記述してください。
bashの場合.bash_profileに記述します。
LC_ALL=en.US UTF=8
計算に使用するノードは、スケジューラ側が自動で最適なノードを割り当てるようになっており、利用者様の方では指定することはできません。
ご理解くださいませ。
ラインの太さの調整には以下の2つの方法があります。
ライン自体の大きさはglyphモジュールのScaleパラメータで調整が行なえます。
ラインの太さはObjectメニューで変更します。操作手順は以下のとおりです。
1.エディター→Objectを開く
2.ObjectメニューでObject[General]を[Properties]に変更
3.PropertiesのTypeを[General]から[Point/Line]に変更
4.Line Thicknessのスライダーで太さを調整
ラインの太さを変更しても、OputputImageで画像サイズを大きくして出力した場合相対的にラインが細く見える場合があります。この場合はTubeモジュールを使用することで画面サイズに応じて太くなる形状を作成できます。
TubeモジュールはMain.Mappers登録されており、ライン表示をしているモジュールの下に接続して利用します。
TubeのメニューのScaleで太さの調節ができます。
以下のリンク先にtubeのサンプルデータを設置しています。
(ダウンロードして拡張子を「.v」に変更することでモジュールとしてそのまま使用することができます。)
tubeサンプル
 
以上の点で何かご不明な点がありましたら下記のWEBフォームよりご連絡くださいませ。
お問い合わせフォーム
coordinate_mathなどで座標の計算が必要な場合になる場合がありますが、V言語での計算式の記述は下記の記述例のようにExcelやC言語とほぼ同じ形式で記述することができます。
記述例
X : (#1x*15)+12
Y : (#1y*15)+12
Z : (#1z*15)+16
指定の#1x,#1y,#1zが座標値の変数です。
また+,-,*,/の四則演算や()による計算順序の指定が行なえます。
ご不明な点がありましたら下記のWEBフォームよりご連絡くださいませ。
お問い合わせフォーム
データを球状で抽出する場合にはcrop_sphereモジュールが利用でき、抽出する球の中心、半径はcrop_sphereのメニューで指定ができます。
このモジュールは球の範囲内の要素をそのままの形状で残すため、球面の滑らかさはもとの要素の形状に依存します。
球面上のデータを表示する場合はinterp_dataを使用して球面にデータを補間して表示する方法があります。
こちらの場合、球内部のデータは抽出できませんが、球表面に関しては滑らかに表示されます。
また球の位置と半径はcoordinate_mathで調整することが可能です。
以下のリンク先にcrop_sphere,interp_dataのサンプルデータを設置しています。
(ダウンロードして拡張子を「.v」に変更することでモジュールとしてそのまま使用することができます。)
crop_sphereサンプル
interp_dataサンプル
 
ご不明な点がありましたら下記のWEBフォームよりご連絡くださいませ。
お問い合わせフォーム
コンパイル時に、OpenMPや自動並列化を使用するオプションを指定した場合、並列化指示行の有無に関わらず、「並列版ライブラリ」がリンクされます。「並列版ライブラリ」の関数(並列版の関数)には通常版ライブラリと比べて、排他制御のために他スレッドのリソースへのアクセスを制限する「ロック処理」が組み込まれています。
並列化指示行を挿入していない箇所で並列版の関数がコールされた場合、1スレッドで動作するので、実際にロック処理に伴う「他スレッドの処理待ち」が発生するわけではないのですが、例えば、「排他が必要かどうか」といった判定を行う都合で、わずかですが通常版ライブラリより処理時間が増えることとなります。
一回のオーバヘッドはわずかですが、大量にコールすると、処理時間に大きく影響することとなります。
ご注意ください。
MPIを用いた場合、通常は各プロセスごとに出力ファイルが生成されます。しかしMPI-IOを用いて出力先を指定することで、各プロセスの出力を1つのファイルにまとめることができます。
MPI-IOはMPIプログラミングを行うことを前提としています。MPIの基本的な利用方法やコマンドについてはこちらをご覧ください。
以下にfortranで書かれたプログラムを紹介します。こちらを参考に説明します。
各プロセスごとにプロセスID(rank)を取得し、output.datの任意の位置に出力するプログラムです。
たとえば自身のプロセスIDが4の場合、output.datの16-19バイト目(INTEGER換算で5番目)に自身のプロセスIDを書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
program sample include 'mpif.h' !! MPI用のインクルードファイル(必ず指定) integer ierr,myrank integer (kind=mpi_offset_kind) idisp call MPI_INIT(ierr) !! MPI並列 開始 call MPI_COMM_RANK(mpi_comm_world,myrank,ierr) !!プロセスID(rank)の取得 idisp=0+4*myrank call mpi_file_open(mpi_comm_world,'output.dat',mpi_mode_rdwr+mpi_mode_create,mpi_info_null,ifh,ierr) call mpi_file_set_view(ifh,idisp,mpi_integer,mpi_integer,'native',mpi_info_null,ierr) call mpi_file_write(ifh,myrank,1,mpi_integer,mpi_status_ignore,ierr) call mpi_file_close(ifh,ierr) call MPI_FINALIZE(ierr) !! MPI並列 ここまで stop end |
プログラムのハイライト部分(8行目-11行目)が、MPI-IOプログラムになります。また7行目は直接MPI-IOに関係があるわけではないですが、9行目でコマンドに引数として渡す変数を設定している部分になりますので、必要な処理になります。
2行目、6行目-7行目、13行目はMPIでの処理を行うためのプログラムです。こちらについてはMPI利用方法(VCC)のページで解説を行っていますのでそちらを参考にしてください。
以下で8行目-11行目のコマンドについて詳しく説明していきます。
MPI-IOでの入出力先のファイルをオープンするためのコマンドです。
MPI-IOを行う場合は最初にcallする必要があります。
引数 | |
---|---|
comm | コミュニケータを指定します。通常はMPI全プロセスをあらわす「MPI_COMM_WORLD」を指定することが多いです。 |
filename | 入出力先のファイル名を指定します。 |
amode | アクセスモードの設定をします。「|」をはさむことで複数同時に指定することが可能です。代表的なものをいくつか紹介します。 mpi_mode_rdonly:読み込みのみ可能 mpi_mode_wronly:書き込みのみ可能 mpi_mode_rdwr :読み書き両方可能 mpi_mode_create:filenameで指定した名前のファイルがない場合、自動で作成 mpi_mode_excl :filenameで指定した名前のファイルがすでに存在する場合、エラーを返す これ以外にも様々なモードが存在します。 |
info | 入出力先のファイル情報を設定できますが、基本的には何も渡さない「mpi_info_null」で問題ありません。 |
fh | ファイルハンドルです。これ以降filenameで指定したファイルは、fhで指定したファイルハンドルで指定することになります。 |
ierr | 正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます。 |
各プロセスのファイルへの入出力開始地点(ポインタ)を指定するコマンドです。
ここでうまくポインタの指定ができていないと、出力結果に変に空白ができてしまったり、上書きが発生してしまったりします。
引数 | |
---|---|
fh | ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
disp | ポインタのオフセット距離をバイト数で指定します。たとえばここで4を引数として渡した場合、5バイト目にポインタがセットされます。CHARACTER型は1文字1バイトのデータ型なので、この場合はファイルの先頭から4文字分のスペースが空いていることになります。またINTEGER型で考えると、通常は1つ4バイトのデータ型なのでINTEGER1つ分のスペースが空いていることになります。 |
etype | ファイルの基本単位を設定します。書き込む際のデータ型もしくはmpi_byteを指定します。 |
ftype | ファイルのひとまとまりの単位を設定します。各プロセスが複数回にわたって規則的に入出力を行う際などに利用するもので、決まった型だけでなくユーザーが独自に作ったものを設定することも可能です。各プロセスが入出力を1回しか行わない場合はetypeと同じものを設定しておきます。 |
datarep | データの表現方法を指定します。基本的にはバイナリ表現を表す「native」で問題ありません。 ※必ず小文字で指定してください。 |
info | 入出力先のファイル情報を設定できますが、基本的には何も渡さない「mpi_info_null」で問題ありません。 |
ierr | 正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
実際にファイルに出力するためのコマンドです。
MPI_File_openでオープンしたファイルにMPI_File_set_viewで指定されたポインタから書き込み始めます。
引数 | |
---|---|
fh | ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
buf | 実際に書き込む内容を設定します。 |
count | 書き込むデータの数(文字数ではない)を設定します。詳しくはdatatypeの欄で説明します。 |
datatype | 書き込むデータの型です。ここで設定したデータ型を、countで設定した数だけ出力します。 たとえばcharacter型で「hello」と書き込む場合はcountに5を、datatypeにmpi_characterを設定します。 またinteger型で「100」と書き込む場合はcountに1を、datatypeにmpi_integerを設定します。 これはcharacterが1つで1文字を表すデータ型であるのに対し、integerは1つで-2147483648~2147483647の範囲の整数を表すデータ型だからです。 |
status | 入出力先のファイルの通信に関する設定を行えますが、基本的には何も渡さない「mpi_status_ignore」で問題ありません。 |
ierr | 正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
MPI-IOでの入出力先のファイルをクローズするためのコマンドです。
MPI-IOを行う場合は一連の処理の最後にcallする必要があります。
fh | ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
ierr | 正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
上記で作成したoutput.datからデータを読み込み、printで画面に表示するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
program sample include 'mpif.h' !! MPI用のインクルードファイル(必ず指定) integer ierr,myrank,out integer (kind=mpi_offset_kind) idisp call MPI_INIT(ierr) !! MPI並列 開始 call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr) idisp=0+4*myrank call mpi_file_open(mpi_comm_world,'output.dat',mpi_mode_rdwr+mpi_mode_create,mpi_info_null,ifh,ierr) call mpi_file_set_view(ifh,idisp,mpi_integer,mpi_integer,'native',mpi_info_null,ierr) call mpi_file_read(ifh,out,1,mpi_integer,mpi_status_ignore,ierr) call mpi_file_close(ifh,ierr) print '(I2)', out call MPI_FINALIZE(ierr) !! MPI並列 ここまで stop end |
プログラムのハイライト部分(8行目-11行目)が、MPI-IOプログラムになりますが、出力用のプログラムからmpi_file_writeがmpi_file_readに変わったのみでほぼ変化がありません。以下で新たに使用しているmpi_file_readについて解説します。
ファイルから読み込むためのコマンドです。
MPI_File_openでオープンしたファイルのMPI_File_set_viewで指定されたポインタからデータを読み込みます。
引数 | |
---|---|
fh | ファイルハンドルです。MPI_File_openで設定したファイルハンドルを指定します。 |
buf | 読み込んだデータが格納されます。 |
count | 読み込むデータの数を設定します。writeのときと同様に文字数ではないという点に注意してください。 |
datatype | 読み込むデータの型です。ここで設定した型で、countで設定した数だけ読み込みます。 |
status | 入出力先のファイルの通信に関する設定を行えますが、基本的には何も渡さない「mpi_status_ignore」で問題ありません。 |
ierr | 正常終了時に0が格納されます。エラー時はそれ以外の値が格納されます |
MPI-IOを用いて出力されたファイルは通常のreadコマンドでも読み込むことができます。mpi_file_readコマンドは本来、各プロセスにファイルの別々の箇所を読み込ませ、それぞれに並列作業を行わせるためのコマンドですので、MPI-IOによる出力結果をただ読み込むだけならば通常のreadコマンドを用いてデータの読み込みを行います。
上記同様output.datからデータを読み込み、printで画面に出力するプログラムです。
1 2 3 4 5 6 7 |
program sample integer iwrk(20) open(10,file='output.dat',access='direct',recl=4,FORM='BINARY') read(10,rec=1) iwrk close(10) print '(I2)', iwrk end |
ご覧のとおりMPI化を行っていないシリアル実行のプログラムですので、コンパイルやスクリプトでのジョブ投入の記述に誤ってMPI用のコマンドを使わないように注意してください。
上記と同じプログラムをC言語で記述したものも参考までに掲載します。関数はfortran版とほぼ同じですので、説明は省略します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <mpi.h> main(int argc, char * argv[]) { int my_rank; MPI_File fh; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int idisp = 4*my_rank; MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh); MPI_File_set_view(fh, idisp, MPI_INT, MPI_INT, "native", MPI_INFO_NULL); MPI_File_write(fh, &my_rank, 1, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&fh); MPI_Finalize(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <stdio.h> #include <mpi.h> main(int argc, char * argv[]) { int my_rank, i, out; MPI_File fh; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); int idisp = 4*my_rank; MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_RDWR | MPI_MODE_CREATE, MPI_INFO_NULL, &fh); MPI_File_set_view(fh, idisp, MPI_INT, MPI_INT, "native", MPI_INFO_NULL); MPI_File_read(fh, &out, 1, MPI_INT, MPI_STATUS_IGNORE); MPI_File_close(&fh); printf("%d\n", out); MPI_Finalize(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <stdio.h> int main(void) { FILE *fp; char *name = "output.dat"; int c[20]; int i; fp = fopen(name, "rb"); fread(&c, sizeof(int), 20, fp); fclose(fp); for(i=0; i<20; i++) printf("%d\n", c[i]); return 0; } |