6

並列 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
4

1 に答える 1

4

関係する限り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は無効であり、ループ変数への代入は許可されていません。parforn

于 2012-12-08T01:31:28.507 に答える