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

4 views (last 30 days)
O.E
O.E on 6 Mar 2018
Commented: Jiro Doke on 8 Mar 2018
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

Accepted Answer

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

Sign in to comment.

More Answers (0)

Categories

Find more on 並列 for ループ (parfor) in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!