大きな行列 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);
それは、各ワーカーにメモリ内のコピーを与えることと同じではありませんか? では、ワーカーはマトリックスのローカル コピーを作成しますか?