Main Content

for (drange)

分散範囲に対する for ループ

説明

for loopVar = drange(range); statements; end; は、分散範囲に対して for ループの反復を並列実行します。

MATLAB® は、ほぼ等しい長さの連続セグメントを使用して、range により指定された範囲を並列プールのワーカー間で分割します。次に MATLAB は、各ワーカーで指定された loopVar の範囲に対し、statements にあるループ本体のコマンドを for ループで実行します。

反復が任意の順序で実行できるよう、各反復は他の反復から独立している必要があります。ループ本体内では、他のワーカーとの通信は許可されていません。

各ワーカーは対話型分散配列のローカルな部分にアクセスできますが、他のワーカーに格納されている部分にはアクセスできません。loopVar を使用すると、以下の条件で対話型分散配列のローカル部分にインデックス付けができます。

  • ループ インデックス rangerange = 1:N の形式で指定されている

  • 配列が既定の 1d 分散スキームを使用して分散されている

  • 分散次元に沿った配列のサイズが N である

break ステートメントを使用すると、ループの実行を終了できます。

すべて折りたたむ

この例では、魔方陣のランクを検出する方法を示します。対話型分散配列のローカル部分のみにアクセスします。

spmd
   r = zeros(1, 40, codistributor());
   for n = drange(1:40)
      r(n) = rank(magic(n));
   end
end
r = gather(r);

この例では、πのモンテカルロ近似を実行する方法を示します。

spmd
   m = 10000;
   for p = drange(1:numlabs)
      z = rand(m,1) + i*rand(m,1);
      c = sum(abs(z) < 1); 
   end
   k = gplus(c)
   p = 4*k/(m*numlabs);
end
p{1}
ans = 3.1501

この例では、フィボナッチ数の計算を試行する方法を示します。ループ本体に依存関係があるため、この例は "機能しません"。以下のコードではエラーが発生します。

spmd
   f = zeros(1, 50, codistributor());
   f(1) = 1;
   f(2) = 2;
   for n = drange(3:50)
      f(n) = f(n-1) + f(n-2)
   end
end
Error detected on workers 2 3 4 5 6.

Caused by:
    Error using codistributed/subsref (line 40)
    Error using codistributed/subsref (line 40)
    Inside a FOR-DRANGE loop, a subscript can only access the local portion of a codistributed array.

入力引数

すべて折りたたむ

ループ変数名。テキストとして指定します。

ループ インデックスの範囲。start:finish または start:increment:finish の形式をもつ式として指定します。インクリメントの既定値は 1 です。

ループ本体。テキストとして指定します。for ループで実行する一連の MATLAB コマンド。

statements には、以下の関数を含め、通信を行う関数を含めてはなりません。

バージョン履歴

R2007b で導入

参考

| |