Parforループに​おけるワークスペース​上の変数の扱いについ​て

조회 수: 8 (최근 30일)
O.E
O.E 2018년 3월 6일
댓글: Jiro Doke 2018년 3월 8일
Parforループ上での変数の扱いについて教えてください。
下記のようなプログラムを書いた場合、Workspace上の変数INはワーカーの数だけ読み込まれるのでしょうか?
例えばINのサイズが100MB程度だとして、ワーカーの数が4つあるとすると約400MBのメモリを占有するという考え方であっているでしょうか。
またその場合、INは下のfunctionでは読み込みだけしか行わないので、それぞれのワーカー上で展開しなくてもよい方法などはありませんか?
j = (0:0.05:0.3);
     [IN] = read_Input();
     c =1/32;
parfor i =1:length(j)
a = j(1,i);
[final]=abc(a,b,c,IN);
end

채택된 답변

Jiro Doke
Jiro Doke 2018년 3월 6일
基本的には parfor 内の計算はワーカーの MATLAB プロセスで計算されるため、使われる変数はワーカーのワークスペースに一時的でも存在しなくてはなりません。ワーカーは共有メモリ(shared memory)ではなく分散メモリ(distributed memory)の構造のため、必要なデータはすべてコピーされる必要があります。
ただし、書き方によってはすべてのワーカーに同じデータを渡すのではなく、それぞれのワーカーが必要としている部分だけを渡すことができます。(参考: スライス化された変数 )例えば
IN = read_input();
parfor i = 1:size(IN,2)
final(i) = abc(IN(:,i))
end
この場合、 IN はインデックスされていて、各ワーカーにはそれぞれが担当する列だけが渡され、データ通信が最小限に抑えられます。
また、 abc の中でどのような処理を行っているかにもよりますが、 分散配列 を使ってデータをワーカーに分散して扱う方法もあります。
  댓글 수: 2
O.E
O.E 2018년 3월 6일
INはCell行列になっています。そして、全列が各ワーカーで必要となる構造になってしまっています。ABC内ではINとその他のデータを用いて(aがパラメータ)SIMULINKでシミュレーションを行っています。
INは2列のデータ列なのですが、非常に長く、結果として容量がかなり大きいため、上手くメモリ使用量を抑える手法を検討しています。
分散配列というのは各列をワーカーに分散させる手法の一つという認識であってますでしょうか。
Jiro Doke
Jiro Doke 2018년 3월 8일
もしかして IN は Simulink モデルへの入力データ(時間、データ)ですか?
もし、すべてのデータが各ワーカーで必要な場合は、やはりすべてのワーカーにコピーが必要ですが、ひとつ言えますのは、この問題はメモリの問題というよりデータ通信(クライアントMATLABとワーカーとのやり取り)の問題かもしれません。もし、各ワーカーで read_input() が実行できる場合は、 abc の中で read_input() を呼ぶという方法をお勧めします。すると各ワーカーでデータを読み込むため、通信のオーバーヘッドがなくなります。
「分散配列というのは各列をワーカーに分散させる手法の一つという認識であってますでしょうか。」
そういうイメージですね。ただ、列単位とは限りません。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 並列 for ループ (parfor)에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!