質問

また、MATLABの実施適応的な行列-ベクトル積のための非常に大きな疎行列から特定のdiscretisationのPDE(既知のsparsityることができる。

後に多くの加工で終わる数多くの異なるブロック(以上、200)いて触れたいと思い計算を選択できます。

の前処理段階を決定する数)応募たブロックしたいの計算には、私のことをほぼ完全な測定時間毎にブロックがかかります(すべての意図や目的の努力の積分公式をお持ちでない方もご利用頂けます。

感謝 https://stackoverflow.com/a/9938666/2965879, いうことになるが、この順序付けのブロックの逆で、このようにgoading MATLABへの最大のものです。

しかし、エントリ数が異なるので気からブロックをブロックを直接走行parfor限定のブロックの最大数を作る場合であっても、供給されたループの経験をしてきました。

私の解決は最大のブロックを直列がparallelisedのレベルのエントリーが可能です。), るとオーバーヘッドの当たりiterandないものにresp.のブロックしない小さすぎます。他のブロックとしていparfor.理想的には、今ましょうMATLABの決定はうまで入れ子parforループが喪失し、平行度、この方法でやらねばならない。また、包装の両方のループを一つので(夜)は不可能です。

私の質問がどのように判断できるこのカットオフのシリアルの並行制度を踏まえ、情報のエントリ数の形状の曲線の作品によって異なり異なる問題などの労しています。

これまで続けていたのですが、"これからの12の労働者でご利用の標準PCTライセンスが、今現在作業クラスターを確定し、このカットオフがやりとりされていますが(多くのコアをオーバーヘッドのシリアルループがコスト高に比べ、並列のループが同様に、ブロックが保持されるまで、残りのものから).

12コア(resp.の構成計算サーバーのすべてが、私の博合理的なパラメータの100件当たりの労働者として、これがうまくいっていませんが、コア数な小さな関数ブロック(e.g64vs200).

しかしdeflateのコア数の異なる国(例えば1/2,3/4),もない作業を一貫して行います。次いたグループのブロックをバッチを決定することのカットオフが作りの平均単ッresp.数のバッチから終了:

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(...,...) 結合条件(とともに最小限の作品就業者一人当たりの)が必要であることのない考慮したほうが良いと思います。と思った少しつかの分散などであるが、これまでのところ、すべてが試みられてきた。

長谷川さん、こんば良いの考えをどのように解決するのか。

役に立ちましたか?

解決

また、やや満足できる解決を図った場合は、誰の心に思いを共有します。私もコメントを改善/インを微調整します。

基本的に、そしての良識ある方には(非常に)初歩的なモデルのスケジューラのための並列プ:

function c=est_cost_para(cost_blocks,cost_it,num_cores)
% Estimate cost of parallel computation

% Inputs:
%   cost_blocks: Estimate of cost per block in arbitrary units. For
%       consistency with the other code this must be in the reverse order
%       that the scheduler is fed, i.e. cost should be ascending!
%   cost_it:     Base cost of iteration (regardless of number of entries)
%       in the same units as cost_blocks.
%   num_cores:   Number of cores
%
% Output:
%   c: Estimated cost of parallel computation

num_blocks=numel(cost_blocks);
c=zeros(num_cores,1);

i=min(num_blocks,num_cores);
c(1:i)=cost_blocks(end-i+1:end)+cost_it;
while i<num_blocks
    i=i+1;
    [~,i_min]=min(c); % which core finished first; is fed with next block
    c(i_min)=c(i_min)+cost_blocks(end-i+1)+cost_it;
end

c=max(c);

end

パラメータ cost_it のための空の繰り返しは、原油ブレンドの多くの異なる側面の影響が考えら分離すること:のコストは空の繰り返しに for/parforループ(きによって異なりブロック)の起動時間resp.送信データの parforループだけるかどうか。私の主な理由捨てるものとはならないようにしたいて算/決をきめ細かいます。

私は、上記のルーチンを決めるcut-off次のようになっています:

% function i=cutoff_ser_para(cost_blocks,cost_it,num_cores)
% Determine cut-off between serial an parallel regime

% Inputs:
%   cost_blocks: Estimate of cost per block in arbitrary units. For
%       consistency with the other code this must be in the reverse order
%       that the scheduler is fed, i.e. cost should be ascending!
%   cost_it:     Base cost of iteration (regardless of number of entries)
%       in the same units as cost_blocks.
%   num_cores:   Number of cores
%
% Output:
%   i: Number of blocks to be calculated serially

num_blocks=numel(cost_blocks);
cost=zeros(num_blocks+1,2);

for i=0:num_blocks
    cost(i+1,1)=sum(cost_blocks(end-i+1:end))/num_cores + i*cost_it;
    cost(i+1,2)=est_cost_para(cost_blocks(1:end-i),cost_it,num_cores);
end

[~,i]=min(sum(cost,2));
i=i-1;

end

特に、いを膨らませ/の値を変更する est_cost_para る想定外 cost_it 最も楽観的なケジューリングが可能です。私として残すために、それは主としてどうなるかはわからないようです。保守的な(避け供給も大きなブロックの並列ループ)は、このコースの追加割合のバッファーとしても使用電源>1を膨らませる並行します。

ることにも注意 est_cost_para 呼続以下のブロックが使っている変数名 cost_blocks 両方のルーチンは、サブセットを生成するための開発ツールです。

と比較してアプローチに私の語に絶問いに見える二つのメリット:

  1. の比較的複雑な依存性のデータもブロックの数などのコスト)とのコア数が捕獲したり、スケジューラの模擬することはできずング式。
  2. 計算のコストの全ての可能な組み合わせのシリアル-パラレル分布とその最小はできません"こだわった"ものを読みながらのデータからは一面例によるジャンプは大型のデータですが、小さいとの比較をしています。

もちろん、漸近的計算量で呼び出し est_cost_para その中にループすべての時間が、自分の場合(num_blocks<500)これは絶対にできます。

最後に、場合にも価値の cost_it なかには現在そのもの、のみによって算出してくださいによる測定の実際の実行時間に各ブロックについては、純粋に並列部分にアピールするとともに、そのようにこれらのデータのコスト予測した動きを習得することの値が更新され cost_it は、次の通常の使用の違いをトータルコストと並列にコストを挿入することによりコストがゼロの装着式)。これも"に収束"が最も有用な価値 cost_it の問題の質問です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top