4

block1 ごとに block2 を並列化し、外側のループも並列化したいと考えています。

以前のコード:

    for i=rangei
        <block1>
        for j=rangej
            <block2> dependent on <block1>
        end
    end

変更されたコード:

    parfor i=rangei
        <block1>
        parfor j=rangej
            <block2> dependent on <block1>
        end
    end

これはどれくらい効率的で、変更されたコードは正しいことをするでしょうか? 変更されたコードは要件に対して有効ですか?

4

4 に答える 4

5

MATLAB では、parfor入れ子にすることはできません。つまり、コード内で 1 つparfor を a for(最も可能性の高い外側のループ) に置き換える必要があります。より一般的には、parfor に関するこのチュートリアルを参照することをお勧めします。

于 2013-10-05T03:31:13.017 に答える
4

parfor入れ子にすることはできません。ネストされたparforステートメントでは、最も外側の への呼び出しのみparforが並列化されます。つまり、への内側の呼び出しparforは不要なオーバーヘッドを追加するだけです。

で高い効率を得るにparforは、反復回数をワーカー数 (または各反復に同じ時間がかかる場合は正確な倍数) よりもはるかに多くする必要があり、1 回の反復に数ミリ秒以上かかることを回避する必要があります。並列化によるオーバーヘッドを感じます。

parfor i=rangei
    <block1>
    for j=rangej
        <block2> dependent on <block1>
    end
end

のサイズによっては、実際にその説明に適合する場合がありrangeiます。または、ネストされたループを単一のループに展開して、線形インデックス全体を反復することもできます。

于 2013-10-05T07:15:14.710 に答える
0

ネストされた parfor を使用することはできません。あなたの質問から、行列 (パラメーター i,j を使用) で作業しているようです。blockprocを使用してみてください

于 2013-10-05T06:00:19.247 に答える