サポートされているスケジューラの通信ジョブのプログラム
スケジューラと条件
任意のタイプのスケジューラを使用して通信ジョブを実行することができます。このセクションでは、サポートされているスケジューラ (MATLAB® ジョブ スケジューラ、ローカル スケジューラ、Microsoft® Windows HPC Server (CCS を含む)、Spectrum LSF®、PBS Pro®、または TORQUE) 用に通信ジョブをプログラムする方法を説明します。
サポートされているインターフェイスを通信ジョブで使用するには、以下の条件が該当していなければなりません。
クライアントとクラスター マシンの間の共有ファイル システムが必要とされる。
クライアント マシンからスケジューラにジョブを直接投入できなければならない。
メモ
サードパーティ製スケジューラを使用して通信ジョブを実行する際、条件のいずれかが満たされていない場合は、汎用スケジューラ インターフェイスを使用しなければなりません(通信ジョブには、parpool
、spmd
および parfor
も含まれます)。詳細については、汎用スケジューラのプラグイン スクリプトを参照してください。
タスク関数のコーディング
この例は、サードパーティ製スケジューラにおける通信ジョブのプログラミングの基本的原則を示しています。次の例では、spmdIndex
の値が 1
のワーカーが魔方陣を作成します。この魔方陣は、ジョブを実行しているワーカーの数 (spmdSize
) と等しい数の行と列で構成されています。この場合、4 つのワーカーが 4 行 4 列の魔方陣を用いて通信ジョブを実行します。最初のワーカーが関数 spmdBroadcast
を使用して行列を他のすべてのワーカーにブロードキャストすると、各ワーカーは行列の 1 つの列の和を計算します。これらの列の和がすべて関数 spmdPlus
によって集計され、元の魔方陣の要素の総和が計算されます。
この例の関数を以下に示します。
function total_sum = colsum if spmdIndex == 1 % Send magic square to other workers A = spmdBroadcast(1,magic(spmdSize)); else % Receive broadcast on other workers A = spmdBroadcast(1); end % Calculate sum of column identified by spdmIndex for this worker column_sum = sum(A(:,spmdIndex)); % Calculate total sum by combining column sum from all workers total_sum = spmdPlus(column_sum);
関数を、MATLAB クライアントのパス上に colsum.m
という名前のファイルとして保存します。ジョブの AttachedFiles
プロパティを使用して、各ワーカーにファイルが送信されます。
この例では 1 つのワーカーが魔方陣を作成して他のワーカーにブロードキャストしていますが、他のワーカーにデータを与える方法は他にもあります。各ワーカーは独自に行列を作成できます。あるいは、各ワーカーでディスク上のファイルからデータの該当部分を読み取る、データをタスク関数に引数として渡す、またはデータをジョブの AttachedFiles
プロパティに記載されたファイルで送信するなどの方法もあります。どのソリューションを選択するかは、ネットワーク構成およびデータの特性によって決まります。
クライアントのコード
独立ジョブの場合と同様に、プロファイルを選択し、関数 parcluster
を使用して MATLAB クライアントにクラスター オブジェクトを作成します。使用するスケジューラに応じてプロファイルは多少異なりますが、プロファイルを使用してできるだけ多数のプロパティを定義することで、スケジューラ タイプ間のコーディングの違いが最小限になります。
次のコードを用いてクラスター オブジェクトの作成と構成を行うことができます。
c = parcluster('MyProfile')
ここで、'MyProfile'
は使用するスケジューラ タイプのクラスター プロファイルの名前です。さまざまなクラスター オプションで必要とされる違いは、プロファイルで制御します。スケジューラのタイプごとに、1 つ以上の異なるプロファイルを設定できます。詳細については、クラスターの検出とクラスター プロファイルの使用を参照してください。システム管理者の指示に従ってプロファイルを作成または変更します。
クラスター オブジェクトを定義したら、関数 createCommunicatingJob
でジョブ オブジェクトを作成します。ジョブを作成する際に、ジョブの Type
プロパティを 'SPMD'
に設定しなければなりません。
cjob = createCommunicatingJob(c,'Type','SPMD');
関数ファイル colsum.m
(タスク関数のコーディングで作成) は MATLAB クライアントのパスにありますが、ワーカーで使用できるようにする必要があります。これを行う 1 つの方法はジョブの AttachedFiles
プロパティの使用ですが、これは、使用したプロファイルで設定するか、あるいは次のコードをコマンド ウィンドウに入力することによって設定できます。
cjob.AttachedFiles = {'colsum.m'}
たとえば使用するワーカー数の設定など、他のプロパティをジョブに設定することもできます。ここでも、特定の状況でプロファイルが役に立つことがあります。特に、ジョブの大半で多くの同じプロパティ設定が必要な場合には有益です。この例を 4 つのワーカーで実行するには、これをプロファイルに設定するか、または次のクライアント コードを使用します。
cjob.NumWorkersRange = 4
ジョブの 1 つのタスクを、通常どおり関数 createTask
で作成します。次の例では、タスクは各ワーカーから 1 つの引数のみを返し、関数 colsum
には入力引数がありません。
t = createTask(cjob, @colsum, 1, {})
submit
を使用してこのジョブを実行します。
submit(cjob)
ジョブが完了するまで MATLAB クライアントを待機させてから、結果を収集します。結果は各ワーカーからの 1 つの値で構成されます。タスクの関数 spmdPlus
がワーカー間でデータを共有するため、各ワーカーの結果は同じになります。
wait(cjob) results = fetchOutputs(cjob) results = [136] [136] [136] [136]