サポートされているスケジューラの通信ジョブのプログラム
スケジューラと条件
任意のタイプのスケジューラを使用して通信ジョブを実行することができます。通信ジョブには、parpool、spmd および parfor も含まれます。以下の手順は、ローカルの Processes クラスター、MATLAB® ジョブ スケジューラ クラスター、または MATLAB Parallel Server™ と連動する任意のサードパーティ製スケジューラ クラスターで実行される通信ジョブをプログラムする方法を示しています。ジョブの基本的なプログラミング順序は、すべての各種スケジューラ タイプで同じです。
タスク関数のコーディング
この例は、通信ジョブのプログラミングの基本的原則を示しています。次の例では、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]