2

現在、次のことを行うMatlabコードがあります。

map = collections.Map;
for i = 1:N
    key = getKey(i);
    if isKey(map, key)
        % Return the value stored at key.
    else
        % Calculate a new value, store it in the map using key.
    end
end

このループは実行に時間がかかるため、効率を改善するために parfor を使用したいと考えています。ただし、parfor ループ内でマップに値を割り当てることができないようです。私に何ができるかについてのアイデアはありますか?collections.Map の使用法は確固たるものではありません。並列化されたメモ化が高速で効率的である限り (そしてスレッドセーフである限り、Map はおそらくそうではないことを認識しています)、別の提案を受け入れます。

以下のコメントから追加: ループ中にマップに新しい値を追加するためのスレッドセーフな方法を増やして、後続のループで事前に計算された値を使用できるようにすることを望んでいます。計算は時間的にかなり高価です。

4

2 に答える 2

0

明らかに、container.mapを参照しています。一時配列/セル配列を使用しての積を保存しparfor、ループの後にすべての新しいものを割り当てます。

% original map
keySet = {'a','b','c','f'};
map = containers.Map(keySet, 1:length(keySet));

% simulates your keys/generated values 
getKey = {'f','g','h'};
getVal = (5:7);

% Parfor body
parfor i = 1:3
    key = getKey{i};
    if isKey(map, key)
        % Return the value stored at key.
        map(key);
    else
        % Calculate a new value, store it in a temp array/cell-array 
        keyNew{i} = key;
        valNew(i) = getVal(i);
    end
end

% assign to map the new pairs of keys/values
indNew = ~cellfun(@isempty, keyNew); % clean up empty cells
newMap = containers.Map(keyNew(indNew), valNew(indNew));
map = [map; newMap];

編集:ループのようなparforものがないという理由だけで、後続の反復で値を使用して動的に使用できるようにすることはできません。subsequent iterationsparfor

parforのドキュメントから:

注: 反復順序は独立しているため、parfor の実行は確定的な結果を保証しません。

これが意味することは (このSOの質問/回答がうまく強調されているように)、通常の for ループとは対照的に、並列実行の反復は AND であると見なされなければならないということです。その結果、それらの実行/終了の順序は予測できず、他の反復の出力へのアクセス/依存性は現実的ではありません。

于 2013-08-08T18:42:13.290 に答える