0

大きな行列 M (18000 x 18000 のようなサイズ) とサイズの配列 k があります

k =[k_1,..,k_{100*50}]

小さな行列 C (18000 x 100 など)

とイテレータ

iIterator = [1,...,100]

私はこのようないくつかの計算を行います

bestValue = inf
parfor i = iIterator

    for j = 1:50
      thing = computeSomething(C(:,1:i),k(i+j))
      value = evalThing(thing,M);
      if value < bestValue
           bestValue = value;
           best_i_Idx = i;
      end 

end 

M が大きい場合、各ローカル ワーカーにコピーされるため、メモリの問題が発生します。ただし、M は変更されません。

質問 :

1) M のローカル コピーを回避するにはどうすればよいですか?

2) そのようなアルゴリズムに最適な並列構造はどれですか?

3) memmapfile について読みました。その目的で使用することは可能ですか?たとえば、M をファイルに保存するとします。

 mValues.dat

次に、各ワーカーにオブジェクトを渡すことができます

m=memmapfile('mValues.dat','Format',{'double', [18000 18000],'x'})

しかし、一度アクセスすると

value = evalThing(thing,m.Data.x);

それは、各ワーカーにメモリ内のコピーを与えることと同じではありませんか? では、ワーカーはマトリックスのローカル コピーを作成しますか?

4

0 に答える 0