私は、PDE の特定の離散化 (既知のスパース構造) から生じる非常に大きなスパース行列の適応行列ベクトル乗算の MATLAB 実装に取り組んでいます。
多くの前処理の後、選択したエントリを計算したい多数の異なるブロック (たとえば、200 を超える) ができあがります。
前処理ステップの 1 つは、計算したいブロックごとの (数) エントリを決定することです。各エントリで同じ)。
https://stackoverflow.com/a/9938666/2965879のおかげで、ブロックを逆順に並べることでこれを利用できるようになり、MATLAB が最初に最大のものから開始するようになりました。
ただし、エントリの数はブロックごとに大きく異なるため、parfor を直接実行することは、ループに逆に供給されたとしても、エントリの数が最大のブロックによって厳しく制限されます。
私の解決策は、最大のブロックを連続して実行することです (ただし、エントリのレベルで並列化されます!)。これは、イテランドあたりのオーバーヘッドがあまり問題にならない限り問題ありません。ブロックは小さくなりすぎません。残りのブロックは parfor で行います。理想的には、MATLAB がこれを処理する方法を決定するようにしますが、入れ子になった parfor ループは並列性を失うため、これは機能しません。また、両方のループを 1 つにパッケージ化することは (ほぼ) 不可能です。
私の質問は、エントリ数に関する情報を考慮して、シリアル体制とパラレル体制の間のこのカットオフをどのように決定するのが最善かについてです (順序付けられたエントリの曲線の形状は、問題によって異なる場合があります)。私が利用できる労働者の数と同様に。
これまでは、標準の PCT ライセンスで利用可能な 12 のワーカーで作業していましたが、クラスターでの作業を開始して以来、このカットオフを決定することがますます重要になっています (多くのコアでは、直列ループは並列ループに比べてますますコストがかかりますが、同様に、残りを保持するブロックを持つことはさらにコストがかかります)。
12 コア (つまり、私が使用していた計算サーバーの構成) の場合、カットオフとしてワーカーあたり 100 エントリという妥当なパラメーターを見つけましたが、コアの数がそうでない場合、これはうまく機能しません。ブロック数に比べて小さくなりました (例: 64 対 200)。
コアの数をさまざまなパワー (1/2、3/4 など) で収縮させようとしましたが、これも一貫して機能しません。次に、ブロックをバッチにグループ化し、エントリがバッチごとの平均よりも大きい場合のカットオフを決定しようとしました。最後から離れているバッチの数:
logical_sml = true(1,num_core); i = 0;
while all(logical_sml)
i = i+1;
m = mean(num_entr_asc(1:min(i*num_core,end))); % "asc" ~ ascending order
logical_sml = num_entr_asc(i*num_core+(1:num_core)) < i^(3/4)*m;
% if the small blocks were parallelised perfectly, i.e. all
% cores take the same time, the time would be proportional to
% i*m. To try to discount the different sizes (and imperfect
% parallelisation), we only scale with a power of i less than
% one to not end up with a few blocks which hold up the rest
end
num_block_big = num_block - (i+1)*num_core + sum(~logical_sml);
(注: このコードはnum_entr_asc
、長さが の倍数でないベクトルでは機能しませんnum_core
が、読みやすくするために構造を省略することにしましたmin(...,end)
。)
< max(...,...)
また、カットオフが早期に検出されないようにするために必要な、両方の条件を組み合わせる (つまり、ワーカーごとの最小エントリと一緒にする) を省略しました。分散をどうにか使用することも少し考えましたが、これまでのところすべての試みは不十分です.
誰かがこれを解決する方法について良いアイデアを持っていれば、とても感謝しています。
この非常に長い質問を読んでくれてありがとう、
よろしく、
アクセル
Ps。私の「Dear stackoverflow」はフィルタリングされているように見えるので、ここで私の質問に対する解決策を何度も見つけてくれてありがとうと言いたい.