parfor
ル,プ内の変数のトラブルシュ,ティング
parfor
ル,プの変数が連続的に増加する整数であることの確認
parfor
ル,プ内のル,プ変数は,連続的に増加する整数でなければなりません。このため,次の例はエラ,を返します。
parforI = 0:0.2:1%非整数parforJ = 1:2:11%非连续parforK = 12:-1:1%不增加
iValues = 0:0.2:1;parforidx = 1: i = iValues(idx);...结束
parfor
ル,プでのオ,バ,フロ,の回避
MATLAB®はparfor
ル,プ変数のオ,バ,フロ,する可能性を検出すると,エラ,を報告します。
オ,バ,フロ,条件 | 例 | 解決法 |
---|---|---|
|
以下で, parforidx = int8 (128:127) idx;结束 |
より大きなデ,タ型を parforidx = 128:127 int8 (idx);结束 |
|
以下で, parforidx = uint32 (0:1) idx;结束 |
|
parfor
ル,プ内の変数分類の問題の解決
MATLABがparfor
ループ内の名前を変数として認識すると,その変数は次の表に示す複数のカテゴリのいずれかに分類されます。変数が一意に分類され,カテゴリ要件を満たすことを確認してください。要件に違反するparfor
ル,プはエラ,を返します。
分類 | 説明 |
---|---|
ル,プ変数 | ルプンデックス |
スラ@ @ス化された変数 | そのセグメントがル,プの異なる反復で演算される配列 |
ブロ,ドキャスト変数 | ル,プの前に定義される変数。その値はル,プ内に必要ですがル,プ内で割り当てられることはありません。 |
リダクション変数 | ル,プの反復を通して値を累積する変数。反復の順序は考慮されません。 |
一時変数 | ル,プ内で作成される変数。ルプ外ではアクセスできません。 |
使用している変数を確認するには,コ,ドフラグメントを調べます。表内のすべての変数分類がこのコ,ドに示されています。
変数分類の問題が生じた場合は,parfor
ル,プの本体を関数に変換するさらに難しい方法を用いる前に,以下の方法を検討してください。
入れ子にされた
为
ル,プを使用して,スラ,parfor
ル,プ内の他の場所でその配列を使用することはできません。左側のコ,ドは機能しません。一个
がスラesc escス化されており,入れ子にされた为
ルプ内でンデックスが付けられているためです。右側のコ,ドは機能します。入れ子にされたルプの外側でv
が一个
に代入されているためです。1行全体を計算してから,スラescス化された出力への代入を一度に実行できます。無効 有効 A = 0 (4,10);parforI = 1:4为A(i, j) = i + j;结束disp((我,1))结束
A = 0 (4,10);parforI = 1:4 v = 0 (1,10);为J = 1:10 v(J) = I + J;结束dip (v(1)) A(i,:) = v;结束
左側のコ,ドは機能しません。
parfor
内の変数x
を分類できないためです。この変数が分類できない理由は,x
の異なる部分への代入が複数あるためです。したがって,parfor
はル,プの反復間に依存関係があるかどうかを判定できません。右側のコ,ドは,x
の値を完全に上書きしているため機能します。これでparfor
は,x
が一時変数であると明確に判定できます。無効 有効 parforIdx = 1:10 x(1) = 7;X (2) = 8;Out (idx) = sum(x);结束
parforIdx = 1:10 x = [7,8];Out (idx) = sum(x);结束
次の例では,構造体配列のフィ,ルドをスラ,ス化する方法を説明します。詳細にいては,
结构体
を参照してください。左側のコ,ドは機能しません。parfor
内の変数一个
を分類できないためです。この変数を分類できないのは,aapl . exeンデックス付けの形式が,スラaapl . exeス化された変数では無効なためです。一个
のフィ,ルドx
が正しくスライス化されているように見えますが,第1レベルのインデックス付けはスライス化されたインデックス付け操作ではありません。右側のコ,ドは正しく機能します。结构体
のフィ,ルドを別の変数tmpx
に抽出しているためです。これでparfor
は,この変数がスラ。通常、结构体
のフィルドやオブジェクトのプロパティを,スラス化された入力変数や出力変数としてparfor
内で使用することはできません。無効 有効 A.x = [];parfora.x(Idx) = 7;结束
TMPX = [];parfortmpx(Idx) = 7;结束A.x = tmpx;
Parforル,プの構造体配列
一時変数としての構造体の作成
ドット表記の代入を使用してparfor
ル,プ内に構造体を作成することはできません。左側のコ,ドでは,ル,プ内の両方の行で分類エラ,が発生します。右側のコ,ドでは,回避策として関数结构体
を使用することで,ル,プ内または最初のフィ,ルド内に構造体を作成できます。
無効 | 有効 |
---|---|
parforI = 1:4 temp.myfield1 = rand();Temp.myfield2 = i;结束 |
parforI = 1:4 temp = struct();Temp.myfield1 = rand();Temp.myfield2 = i;结束 parforI = 1:4 temp = struct(“myfield1”,兰德(),“myfield2”,我);结束 |
構造体フィルドのスラス化
構造体フィルドを,スラス化された“入力または出力”配列としてparfor
ル,プ内で使用することはできません。。左側のコドでは,ンデックス付けが原因でルプ内の両方の行に分類エラが発生します。右側のコ,ドでは,スライス化された出力を回避するために、スライス化された別々の配列をループ内で使用します。そのうえで、ループの完了後に構造体フィールドを割り当てます。
無効 | 有効 |
---|---|
parforoutputData.outArray1(i) = 1/i;outputData.outArray2(i) = i^2;结束 |
parforoutArray1(i) = 1/i;outArray2(i) = i^2;结束输出数据= struct(“outArray1”outArray1,“outArray2”, outArray2); |
スラス化された入力の問題を回避するには,ルプの前に構造体フィルドを別の配列に割り当てます。この新しい配列はスラ@ @ス化された入力に使用できます。
inArray1 = inputData.inArray1;inArray2 = inputData.inArray2;parfori = 1:4 temp1 = inArray1(i);temp2 = inArray2(i);结束
parfor
ル,プ本体から関数への変換
他のすべてが失敗した場合でも,parfor
ル,プ本体を関数に変換することにより,parfor
ル,プでの変数分類の問題を通常は解決できます。左側のコ,ドでは,コ,ドアナラ,ザ,が変数yの問題にフラグを設定しますが,この問題を解決することはできません。右側のコ,ドでは,parfor
ル,プ本体を関数に変換することでこの問題が解決されます。
無効 | 有効 |
---|---|
函数Parfor_loop_body_bad data = rand(5,5);均值= 0 (1,5);parforI = 1:5%代码分析器标记问题%,变量y如下Y.mean = mean(数据(:,i));均值(i) = y.均值;结束disp(意味着);结束 |
函数Parfor_loop_body_good data = rand(5,5);均值= 0 (1,5);parforI = 1:5而是调用一个函数means(i) = computeMeans(data(:,i));结束disp(意味着);结束这个函数现在包含body%的parfor循环函数mean = mean(数据);Means = y.mean;结束 使用“本地”配置文件启动并行池(parpool)…连接4个工人。0.6786 0.5691 0.6742 0.6462 0.6307 |
明確な変数名
parfor
ループ内の変数としてMATLABで明確に識別できない名前を使用すると,関数を参照しているものと解析時に想定されます。その上で,実行に際して関数が見からないと,matlabでエラが発生します変数名を参照してください。たとえば,次のコ,ドでは,f (5)
はf
という配列の5番目の要素を参照しているか,または引数5
をもf
という関数を参照しているかのいずれかです。f
がコ,ド内で変数として明確に定義されていない場合,matlabではコ,ド実行時にパスで関数f
を検索します。
parforI = 1:n...A = f(5);...结束
透過的なparfor
ルプ
parfor
ル,プ本体は“透過的”でなければなりません。まり,変数への参照はすべてコ,ドのテキストにおいて“可視”でなければなりません。透過性の詳細にいては,Parforル,プまたはSPMDステ,トメント内での透過性の確保を参照してください。