0

Matlab と cell2mat() 関数を使用すると、メモリに関して奇妙な動作が発生します...

私がやりたいことは次のとおりです。

cell_array_outer = cell(1,N) 
parfor k = 1:N
  cell_array_inner = cell(1,M);   
  for i = 1:M
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_inner{i} = sparse(A); % do sparse() again just to be paranoid
  end
  cell_array_outer{k} = sparse( cell2mat( cell_array_inner ) ); 
end

Giant_Matrix = cell2mat( cell_array_outer ); % DOH! 

しかし、残念なことに、「DOH」で示される行は、疎行列のサイズを合計した場合に必要以上に、途方もない量のメモリを使用します...大きすぎる中間構造を作成するように。

以下は問題なく動作しますが、二重インデックスは par-for では機能しないため、1 つのコアしか使用できません。

cell_array_giant = cell(M,N) 
for k = 1:N   % cannot use parfor with {i,k} dual indices!

  for i = 1:M
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_giant{i,k} = sparse(A); % do sparse() again just to be paranoid
  end
end

cell_array_giant = reshape( cell_array_giant, 1, M * N )
Giant_Matrix = sparse( cell2mat( cell_array_giant ) ); % Ok... but no parfor 

私の疑いでは、後者の場合、各セル要素のサイズははるかに扱いやすい... 20,000x1 疎行列のようですが、前者では、これらの「外側」要素は 20,000 x 5,000 になり、Matlab が望む場所に何らかの形で適合しません。それらを一時変数として配置すると、極度に希薄であるにもかかわらず、メモリ使用量が制御不能になります。

メモリの使用と上記に関して従うべき規則はありますか? または、2番目のケースでジャイブするようにparforの使用を変更する方法は? 「parfor」はちょっと新しいので、他のコア機能よりもウェブ上にそれについての情報が少ない... matlab の 8 つのコピーを実行するよりもはるかに効率的です!

4

1 に答える 1

0

一時メモリの使用量を予測するには、Matlab 内部の作業について詳しく知る必要がありますが、私は知りません。

2番目の解決策についてはparfor、内側のループ内で実行する場合に使用できます(少なくともm-lint警告は表示されません)。必要に応じて、M>N になるように問題を転置します。これは、通常、parfor長い計算をほとんど行わずに、多くの迅速な計算を行う必要があるためです。これにより、操作の数が 8 で割り切れない場合にオーバーハングが少なくなります (または実行できるコアの数)。

cell_array_giant = cell(M,N) 
for k = 1:N   %# cannot use parfor with {i,k} dual indices!

  parfor i = 1:M %# but you can use it here!
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_giant{i,k} = sparse(A); %# do sparse() again just to be paranoid
  end
end

また、kループ内で巨大疎行列を構築することは可能でしょうか? これにより、再形成が完全に回避されます。もちろん、できるparforのは M ループだけです。そうしないと、巨大な配列がすべてのワーカーに渡され、多くの悲しみが生じるからです。

于 2010-10-30T15:17:10.773 に答える