並列 for ループの反復が独立していることの意味がよくわかりません。以下は、2 つの有効な並列 for ループの例ですか? これらは同じ行列を読み書きしますが、行列のインデックスは反復ごとに一意です。
X = zeros(64);
parfor i = 1:64^2
X(i) = i;
end
parfor i = 1:64
X(i,:) = X(i,:) .* randn(1,64);
end
並列 for ループの反復が独立していることの意味がよくわかりません。以下は、2 つの有効な並列 for ループの例ですか? これらは同じ行列を読み書きしますが、行列のインデックスは反復ごとに一意です。
X = zeros(64);
parfor i = 1:64^2
X(i) = i;
end
parfor i = 1:64
X(i,:) = X(i,:) .* randn(1,64);
end
関係する限りparfor
、次の 3 つのステートメントは同等と見なすことができます。
1)parfor
ループの反復は独立していなければなりません。
2)parfor
ループの反復は、他の反復の結果に依存してはなりません。
3)parfor
ループの反復は任意の順序で実行できる必要があります (@Oli から)
これらのステートメントは、通常のループと比べてどうですか? たとえば、1 から 8 までの典型的なループでは、4 番目の反復は反復 1、2、および 3 に依存する可能性があります。ソフトウェアは、反復番号 4 に到達するまでに、これらの反復がすでに発生していることを確認できるためです。ソフトウェアは、これらの反復が発生しないことを確信できるため、反復 5、6、7、および 8 に依存します。
parfor
ループでは、@Oli が述べているように、ループは任意の順序で発生する可能性があります。たとえば、7 3 4 1 2 5 8 6 のように、次の順序で発生する場合があります。または、これら 8 つの数字の任意の順列。これは、非常に重要なことを意味します。つまり、どの反復が最初に発生するかを事前に知る方法はありません。これを確認するには、ループfprintf('Up to iteration %d of %d\n', t, T)
内で をチャックするだけですparfor
。ここt
で、 はループの添字でありT
、 はループの上限です。
上記のステートメントは、すぐに次の結論を暗示します。反復が最初に発生する可能性があるため、反復が他の反復の結果に依存しないことが重要です。いくつかの例を挙げて答えを締めくくります。
X = ones(8, 8)
parfor n = 1:8
X(:,n) = X(:,n) .* (3 * ones(8,1));
end
この例では、(3 * ones(8,1))
は他の反復に依存していないことは明らかです。ループ カウンターに関しては一定です。同様にX(:, n)
、n 回目以外の反復には依存しません。編集:以前はrandn
上記の例で使用していました-これが悪い考えである理由については、@AndrewJanke によって提供されたコメントの議論を参照してください。この状況はどうですか:
X = ones(8, 8);
parfor n = 1:8
X(:,n) = X(:,n) + (n + 1);
end
これも完全に有効です。式にがありますがn + 1
、これは反復回数に依存するのと同じではありませんn + 1
。むしろ、現在の反復回数に 1 を加えた整数値を に代入しているだけX
です。
最後に、次のことを考慮してください。
X = ones(8, 1);
parfor n = 2:8
X(n, 1) = X(n-1, 1) + 1;
end
これは通常のループでは完全に有効です。なぜなら、反復番号n-1
は常に反復の前に発生するからn
です (順方向にループしていると仮定して)。ただし、parfor
ループでは、 iteration numbern
が iteration number の前に発生する可能性があるため、これによりエラーが発生しますn-1
。ここで問題を説明するために Matlab が使用する専門用語は、「スライス」と呼ばれます。X
ループの繰り返しによってスライスされると想像してください。n 回目の反復では、 の n 番目のスライスのみを参照できますX
。
最後に、ループについて疑問がある場合は、parfor
「Matlab のループの並列処理 - 概要」というタイトルのドキュメントのセクションを読みます (申し訳ありませんが、対応する Web ページが見つかりません - Matlab のドキュメントでは珍しい) すべてについて説明していますループ内で可能な変数の分類、およびparfor
ループが各分類に課す制限。この回答で説明したことは、実際には氷山の一角にすぎません。たとえば、 はループ変数であるため、 のようなステートメントもループ内でn = n + 1
は無効であり、ループ変数への代入は許可されていません。parfor
n