0

たとえば 100 回の反復による parfor ループがあり、反復ごとのワークロードは異なりますが、最初の反復が最も時間がかかり、最後の反復が最も高速になるように直線的に変化します。しかし、4 つのインスタンス/ラボで parfor ループを実行すると、最初の数回の反復を単独で実行しているため、最後の数時間は 1 つのラボのみがアクティブになります。

したがって、どの反復が遅いのかがわかります。コア間のワークロードをより均等にするにはどうすればよいですか。たとえば、すべてのラボに最初の 4 つの遅いラボの作業を強制的に開始させてから、順番に進めるようにするにはどうすればよいでしょうか? または、1 つのアクティブなコアだけがいくつかの遅いコアを単独で実行するのを防ぐための同様の何か..

4

2 に答える 2

2

Matlab parfor は、インデックスを分割してワーカーに配布するだけです。これは、インデックスから連続したチャンクを作成することによって行われます。正確なアルゴリズムはわかりませんが、これは、同様のインデックスを持つデータが同じチャンクで同じワーカーによって計算されることを意味します。

最も簡単な解決策は、確率的なものです。インデックスをシャッフルして、作業の集中的なステップが適切に分散されるようにします。これはパフォーマンスを保証するものではありませんが、単純で、ほとんどの場合に機能します。

いくつかのコード例:

% dummy data
N=10;
data=1:N;

% generate the permutated indices
permIndex=randperm(N);

% permute the data
dataPermuted=data(permIndex);

% run the loop
parfor i=1:N
    % do something e.g. pause for the time as specified by data
    pause(dataPermuted(i));
end

%invert the index permutation
dataInversePermuted(permIndex)=dataPermuted;

一時停止を使用して、さまざまな計算時間をシミュレートしました。

于 2012-07-04T10:11:44.233 に答える
1

これはどこにも文書化されていないと思いますが、PARFOR が逆のループ順序で反復を実行することはすぐに推測できます (動作を確認したい場合はpauseandを使用します)。dispしたがって、単純にループを逆にする必要があります。PARFOR は実行順序を明示的に制御する手段を提供しませんが、for-drangeを使用する SPMDは可能です (ただし、PARFOR は非常に使いやすいです)。

@denahiro の提案も良いものです。

于 2012-07-04T13:12:01.427 に答える