技科大のHPCクラスタ計算機でD言語を簡単にぶん回すためのライブラリです.
次のように,ジョブスケジューラTorqueへのジョブ投入を自動化することができる.
実行されたホストがクラスタ計算機でなければ,ジョブスケジューラへの投入はせずにstd.parallelismによる並列実行を行う.
import std.stdio;
import tuthpc.taskqueue;
void main()
{
// ジョブをスケジューラに投入する際の設定
auto env = defaultJobEnvironment();
// ジョブスケジューラに投げるジョブリスト
auto taskList = new MultiTaskList!void();
// ジョブ1
// スケジューラに投げるジョブを追加する
taskList.append((string s){ writeln(s); }, "Hello, World!");
// ジョブ2
// delegateでもよいが,各ジョブは別のプロセスで実行される,
// つまりあるプロセスでは単一のジョブのみが実行されることに注意しなければいけない.
int a = 12;
taskList.append((){ writeln(a); a = 100; writeln(a); });
// ジョブをジョブスケジューラに投げる
run(taskList, env);
// ここで a が 12 なのか 100 なのかはわからない.
// なぜなら,プロセスによってはジョブ2が実行されないためである.
// (そして,ジョブ2を実行するプロセスは1つだけである.)
assert(a == 12 || a == 100);
}上記プログラムの実行時,各プロセスは以下のような動作を行うことでジョブを実行する.
- クラスタマシン開発用ホストで実行されたとき,
taskListの情報を元にしてジョブスケジューラにジョブを投げる. - クラスタマシンの計算ノード上で実行されたとき,
taskListの中から自分が担当するジョブのみを実行する.
したがって,run(taskList, env);を実行するまで,もしくはそれ以降のすべての処理は,並列化されず,(オーバーヘッドとして)すべてのノードで実行されてしまう.
また,taskListは,すべてのノード,すべてのプロセスで全く同一でなければいけない.
つまり,次のようなプログラムでは実際にはどのようなジョブが実行されるかわからない.
import std.socket;
import std.stdio;
import tuthpc.taskqueue;
void main()
{
// ジョブをスケジューラに投入する際の設定
auto env = defaultJobEnvironment();
// ジョブスケジューラに投げるジョブリスト
auto taskList = new MultiTaskList!void();
// 実行ホストのホスト名を使用する
// 実行される計算機によってはホスト名が異なるため,
// 以下のタスクはどのような実行結果になるか不明である.
foreach(e; Socket.hostName)
taskList.append((char c){ writeln(c); }, e);
run(taskList, env);
}未実装. そのうち実装予定.
MPIはサポートしていません.
-
JobEnvironment.useArrayJobbool- デフォルト値:
true - アレイジョブにする場合
true,個別のジョブを入れる場合はfalseを指定します.現在はfalseでもアレイジョブを投入するようになっています.
-
JobEnvironment.jobNamestring- デフォルト値:
null - ジョブに名前を付けます
-
JobEnvironment.scriptPathstring- デフォルト値:
null - ジョブ投入用のスクリプトファイルの名前やパスを設定できます.
nullの場合は,qsubの標準入力にジョブスクリプトを流し込みます.
-
JobEnvironment.queueNamestring- デフォルト値:
null - 実行時引数:
--th:q,--th:queue, (ex.--th:q=wEduq) - ジョブを投入するキュー名を設定できます.
nullの場合は,自動で研究用キューwLrchqが設定されます.
-
JobEnvironment.unloadModulesstring[]- デフォルト値:
null - ジョブを実行する前に
module unloadするもののリストを設定できます.
-
JobEnvironment.loadModulesstring[]- デフォルト値:
null - ジョブを実行する前に
module loadするもののリストを設定できます.たとえば,matlabなどの読み込みにつかいます.
-
JobEnbvironment.envsstring[string]- デフォルト値:
null - ジョブを実行する前に設定する環境変数を指定できます.
-
JobEnvironment.isEnabledRenameExeFilebool- デフォルト値:
true - ジョブをキューに投入する前に,実行ファイルの別名コピーを作成するか設定します.
trueではコピーを作成します.コピー後のファイル名は,実行ファイルのCRC32の値にもとづき設定されます.この機能は,同一のソースコードでコンパイル時定数を変更してジョブを複数投入する場合に有効です.
-
JobEnvironment.originalExeNamestring- デフォルト値:
null - 実行ファイルの名前を指定します.デフォルトでは,
Runtime.args[0]が設定されます.
-
JobEnvironment.renamedExeNamestring- デフォルト値:
null - リネーム後の実行ファイルの名前を指定できます.
nullの場合,実行ファイルのCRC32値にもとづいて設定されます.
-
JobEnvironment.prescriptstring[]- デフォルト値:
null - ジョブの実行ファイルを実行する前に,前処理を行うシェルスクリプトを指定できます.
-
JobEnvironment.jobScriptstring[]- デフォルト値:
null - ジョブで実行するスクリプトを指定できます.
nullのとき,JobEnvironment.originalExeNameもしくはJobEnvironment.renamedExeNameが実行されます.つまり,これらの値をfooとすると,./fooを実行します.
-
JobEnvironment.postScriptstring[]- デフォルト値:
null - ジョブの終了前に,後処理を行うシェルスクリプトを指定できます.
-
JobEnvironment.isEnabledTimeCommandbool- デフォルト値:
false JobEnvironment.jobScriptがnullのとき,JobEnvironment.originalExeNameもしくはJobEnvironment.renamedExeNameを実行する際にtimeコマンドで時間を計測するか設定できます.デフォルト値falseでは計測しません.
-
JobEnvironment.taskGroupSizeuint- デフォルト値:
0 - 実行時引数:
--th:g,--th:taskGroupSize, (ex.--th:g=7) nodes=1:ppn=1のとき,複数のタスクをまとめて一つのジョブにして投入します.このとき,ppn値をこの値に設定し,この値の個数だけ並列でタスクを実行します.nodes=1:ppn=1で,さらにこの値が0のとき,この値は11として処理されます.この機能は,アレイジョブのジョブ数削減,及びクラスタ計算機の資源を占有しないために存在しています.クラスタ計算機の資源を占有しないためには,この値を7〜14程度の値にすることが望ましいです.
-
JobEnvironment.ppnuint- デフォルト値:
1 - 実行時引数:
--th:p,--th:ppn, (ex.--th:ppn=2) - 1つのジョブが実行される各ノードで何CPU使用するか指定できます.
-
JobEnvironment.nodesuint- デフォルト値:
1 - 実行時引数:
--th:n,--th:node, (ex.--th:node=2) - 1つのジョブを実行するノード数を指定できます.
-
JobEnvironment.mem,JobEnvironment.pmem,JobEnvironment.vmem,JobEnvironment.pvmemint- デフォルト値:
-1 - メモリ使用量を設定できます.
-1のときは設定されません.0のときは,ノードのCPU使用率が高くなるように最大メモリ量とppn値から計算されます.
-
JobEnvironment.isEnabledEmailOnError,JobEnvironment.isEnabledEmailOnStart,JobEnvironment.isEnabledEmailOnFinishbool- デフォルト値:
false - 実行時引数(
JobEnvironment.isEnabledEmailOnError):--th:mailOnError,--th:me - 実行時引数(
JobEnvironment.isEnabledEmailOnStart):--th:mailOnStart,--th:ms - 実行時引数(
JobEnvironment.isEnabledEmailOnFinish):--th:mailOnFinish,--th:mf - ジョブのエラー時,実行開始時,実行終了時にメールを送るかどうか設定できます.
-
JobEnvironment.emailAddrsstring[]- デフォルト値:
null - メールを送る対象のメールアドレスを設定できます.
nullのときは,{username}@edu.tut.ac.jpに送られます.
-
JobEnvironment.maxArraySizeuint- デフォルト値:
8192 - 実行時引数:
--th:m,--th:maxArraySize=, (ex.--th:m=20) - アレイジョブにおける最大のジョブ数を指定します.この数以上のジョブを投入しようとしたとき,1つのジョブで複数のタスクを実行することで,自動的にジョブ数がこの値に収まるように調整されます.
-
JobEnvironment.maxSlotSizeuint- デフォルト値:
0 - 実行時引数:
--th:s,--th:maxSlotSize=, (ex.--th:s=2) - アレイジョブにおいて,クラスタ計算機全体で最大で同時実行されるジョブ数を制限します.この値は
0であれば同時実行数は制限されません.計算資源の占有を回避するために利用します.
-
JobEnvironment.isEnabledQueueOverflowProtectionbool- デフォルト値:
true - 実行時引数:
--th:queueOverflowProtection,--th:qop, (ex.--th:qop=false) - クラスタのキューには16384個以上のジョブを管理できない制限があります.この制限を超えてジョブを投げることがないように,ジョブ投入の前にチェックするかどうかを指定できます.デフォルト値ではチェックします.
-
JobEnvironment.isEnabledUserCheckBeforePushbool- デフォルト値:
true - 実行時引数:
--th:requireUserCheck, (ex.--th:requireUserCheck=false) - クラスタにジョブを投げる前にユーザーに確認を取るか指定します.デフォルト値ではユーザーに確認します.
-
JobEnvironment.isForcedCommandLineArgsbool- デフォルト値:
true --th:forceCommandLineArgs, (ex.--th:forceCommandLineArgs=false)- 実行時に変更された
JobEnvironmentの値をコマンドライン引数で指定した値に上書きします.デフォルト値では上書きします.
-
JobEnvironment.logdirstring- デフォルト値:
null - 実行時引数:
--th:logdir, (ex.--th:logdir=log_dirs) - 各タスクの標準出力や標準エラーが格納されるディレクトリ名を指定します.指定されない場合,実行プログラムのハッシュ値によってディレクトリ名が決まります.このディレクトリ名はシステム上に存在しないディレクトリ名でなければいけません.