豊橋技術科学大学のHPCクラスタ計算機を利用するのに便利なライブラリです
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.

readme.md

TUT-HPC Library for D

技科大のHPCクラスタ計算機でD言語を簡単にぶん回すためのライブラリです.

ジョブスケジューラへのジョブ投入

1タスクあたり1プロセス(1スレッド)方式

次のように,ジョブスケジューラTorqueへのジョブ投入を自動化することができる. 実行されたホストがクラスタ計算機でなければ,ジョブスケジューラへの投入はせずにstd.parallelismによる並列実行を行う.

import std.stdio;
import tuthpc.taskqueue;

void main()
{
    // ジョブをスケジューラに投入する際の設定
    JobEnvironment env;

    // ジョブスケジューラに投げるジョブリスト
    auto taskList = new MultiTaskList();

    // ジョブ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);
}

上記プログラムの実行時,各プロセスは以下のような動作を行うことでジョブを実行する.

  1. クラスタマシン開発用ホストで実行されたとき,taskListの情報を元にしてジョブスケジューラにジョブを投げる.
  2. クラスタマシンの計算ノード上で実行されたとき,taskListの中から自分が担当するジョブのみを実行する.

したがって,run(taskList, env);を実行するまで,もしくはそれ以降のすべての処理は,並列化されず,(オーバーヘッドとして)すべてのノードで実行されてしまう.

また,taskListは,すべてのノード,すべてのプロセスで全く同一でなければいけない. つまり,次のようなプログラムでは実際にはどのようなジョブが実行されるかわからない.

import std.socket;
import std.stdio;
import tuthpc.taskqueue;

void main()
{
    // ジョブをスケジューラに投入する際の設定
    JobEnvironment env;

    // ジョブスケジューラに投げるジョブリスト
    auto taskList = new MultiTaskList();

    // 実行ホストのホスト名を使用する
    // 実行される計算機によってはホスト名が異なるため,
    // 以下のタスクはどのような実行結果になるか不明である.
    foreach(e; Socket.hostName)
        taskList.append((char c){ writeln(c); }, e);

    run(taskList, env);
}

1タスクあたり1プロセス(1プロセス複数スレッド)方式

未実装. そのうち実装予定.

MPIの使用

MPIはサポートしていません.

JobEnvironment

  • JobEnvironment.useArrayJob

    • bool
    • デフォルト値:true
    • アレイジョブにする場合true,個別のジョブを入れる場合はfalseを指定します.現在はfalseでもアレイジョブを投入するようになっています.
  • JobEnvironment.useArgs

    • bool
    • デフォルト値:true
    • trueの場合,プログラムの実行時引数を利用してJobEnvironment型の値を設定します.
  • JobEnvironment.scriptPath

    • string
    • デフォルト値:null
    • ジョブ投入用のスクリプトファイルの名前やパスを設定できます.nullの場合は,qsubの標準入力にジョブスクリプトを流し込みます.
  • JobEnvironment.queueName

    • string
    • デフォルト値:null
    • 実行時引数:--th:q, --th:queue, (ex. --th:q=wEduq)
    • ジョブを投入するキュー名を設定できます.nullの場合は,自動で研究用キューwLrchqが設定されます.
  • JobEnvironment.unloadModules

    • string[]
    • デフォルト値:null
    • ジョブを実行する前にmodule unloadするもののリストを設定できます.
  • JobEnvironment.loadModules

    • string[]
    • デフォルト値:null
    • ジョブを実行する前にmodule loadするもののリストを設定できます.たとえば,matlabなどの読み込みにつかいます.
  • JobEnbvironment.envs

    • string[string]
    • デフォルト値:null
    • ジョブを実行する前に設定する環境変数を指定できます.
  • JobEnvironment.isEnabledRenameExeFile

    • bool
    • デフォルト値:true
    • ジョブをキューに投入する前に,実行ファイルの別名コピーを作成するか設定します.trueではコピーを作成します.コピー後のファイル名は,実行ファイルのCRC32の値にもとづき設定されます.この機能は,同一のソースコードでコンパイル時定数を変更してジョブを複数投入する場合に有効です.
  • JobEnvironment.originalExeName

    • string
    • デフォルト値:null
    • 実行ファイルの名前を指定します.デフォルトでは,Runtime.args[0]が設定されます.
  • JobEnvironment.renamedExeName

    • string
    • デフォルト値:null
    • リネーム後の実行ファイルの名前を指定できます.nullの場合,実行ファイルのCRC32値にもとづいて設定されます.
  • JobEnvironment.prescript

    • string[]
    • デフォルト値:null
    • ジョブの実行ファイルを実行する前に,前処理を行うシェルスクリプトを指定できます.
  • JobEnvironment.jobScript

    • string[]
    • デフォルト値:null
    • ジョブで実行するスクリプトを指定できます.nullのとき,JobEnvironment.originalExeNameもしくはJobEnvironment.renamedExeNameが実行されます.つまり,これらの値をfooとすると,./fooを実行します.
  • JobEnvironment.postScript

    • string[]
    • デフォルト値:null
    • ジョブの終了前に,後処理を行うシェルスクリプトを指定できます.
  • JobEnvironment.isEnabledTimeCommand

    • bool
    • デフォルト値:false
    • JobEnvironment.jobScriptnullのとき,JobEnvironment.originalExeNameもしくはJobEnvironment.renamedExeNameを実行する際にtimeコマンドで時間を計測するか設定できます.デフォルト値falseでは計測しません.
  • JobEnvironment.taskGroupSize

    • uint
    • デフォルト値:0
    • 実行時引数:--th:g, --th:taskGroupSize, (ex. --th:g=7)
    • nodes=1:ppn=1のとき,複数のタスクをまとめて一つのジョブにして投入します.このとき,ppn値をこの値に設定し,この値の個数だけ並列でタスクを実行します.nodes=1:ppn=1で,さらにこの値が0のとき,この値は11として処理されます.この機能は,アレイジョブのジョブ数削減,及びクラスタ計算機の資源を占有しないために存在しています.クラスタ計算機の資源を占有しないためには,この値を714程度の値にすることが望ましいです.
  • JobEnvironment.ppn

    • uint
    • デフォルト値:1
    • 実行時引数:--th:p, --th:ppn, (ex. --th:ppn=2)
    • 1つのジョブが実行される各ノードで何CPU使用するか指定できます.
  • JobEnvironment.nodes

    • uint
    • デフォルト値:1
    • 実行時引数:--th:n, --th:node, (ex. --th:node=2)
    • 1つのジョブを実行するノード数を指定できます.
  • JobEnvironment.mem, JobEnvironment.pmem, JobEnvironment.vmem, JobEnvironment.pvmem

    • int
    • デフォルト値:-1
    • メモリ使用量を設定できます.-1のときは設定されません.0のときは,ノードのCPU使用率が高くなるように最大メモリ量とppn値から計算されます.
  • JobEnvironment.isEnabledEmailOnError, JobEnvironment.isEnabledEmailOnStart, JobEnvironment.isEnabledEmailOnFinish

    • bool
    • デフォルト値:false
    • 実行時引数(JobEnvironment.isEnabledEmailOnError):--th:mailOnError, --th:me
    • 実行時引数(JobEnvironment.isEnabledEmailOnStart):--th:mailOnStart, --th:ms
    • 実行時引数(JobEnvironment.isEnabledEmailOnFinish):--th:mailOnFinish, --th:mf
    • ジョブのエラー時,実行開始時,実行終了時にメールを送るかどうか設定できます.
  • JobEnvironment.emailAddrs

    • string[]
    • デフォルト値:null
    • メールを送る対象のメールアドレスを設定できます.nullのときは,{username}@edu.tut.ac.jpに送られます.
  • JobEnvironment.maxArraySize

    • uint
    • デフォルト値: 8192
    • アレイジョブにおける最大のジョブ数を指定します.この数以上のジョブを投入しようとしたとき,1つのジョブで複数のタスクを実行することで,自動的にジョブ数がこの値に収まるように調整されます.
  • JobEnvironment.isEnabledQueueOverflowProtection

    • bool
    • デフォルト値:true
    • クラスタのキューには16384個以上のジョブを管理できない制限があります.この制限を超えてジョブを投げることがないように,ジョブ投入の前にチェックするかどうかを指定できます.デフォルト値ではチェックします.