Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

サポートされているスケジューラの通信ジョブのプログラム

スケジューラと条件

任意のタイプのスケジューラを使用して通信ジョブを実行することができます。このセクションでは、サポートされているスケジューラ (MATLAB® ジョブ スケジューラ、ローカル スケジューラ、Microsoft® Windows HPC Server (CCS を含む)、Spectrum LSF®、PBS Pro®、または TORQUE) 用に通信ジョブをプログラムする方法を説明します。

サポートされているインターフェイスを通信ジョブで使用するには、以下の条件が該当していなければなりません。

  • クライアントとクラスター マシンの間の共有ファイル システムが必要とされる。

  • クライアント マシンからスケジューラにジョブを直接投入できなければならない。

メモ

サードパーティ製スケジューラを使用して通信ジョブを実行する際、条件のいずれかが満たされていない場合は、汎用スケジューラ インターフェイスを使用しなければなりません(通信ジョブには、parpoolspmd および 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]