Setup-MATLAB: Wie eine HashMap in Parallel-Computing teilen
Ich versuche, einen Algorithmus zu parallelisieren, die auf jeder Zeile einer Matrix den gleichen Code läuft
(und dann postprocesses die Ergebnisse.) Es gibt einige Berechnungen, die bei der Verarbeitung von mehreren Zeilen auftreten (diese Wiederholung ist schwer vorherzusagen).
Daher rufe ich derzeit ein Objekt auf, das diese Berechnungen durchführt und die Ergebnisse in einer HashMap speichert. Wenn die Zeile $ n $ Berechnungen benötigt, die bereits für Zeile $ m $ ausgeführt wurden, müssen sie nicht erneut ausgeführt werden .
Es hat keinen Einfluss auf das Ergebnis des Algorithmus, in welcher Reihenfolge die Zeilen verarbeitet werden.
Problem
Ich bin nicht in der Lage, die HashMap parallel Code zu verwenden, endet jeder Arbeiter mit einem eigenen HashMap auf.
Ich verstehe die Philosophie hinter diesem Verhalten. In meinem Beispiel spielt die Reihenfolge keine Rolle und ich möchte das Standardverhalten umgehen.
Minimal Arbeitsbeispiel
classdef MyPar <handle
properties
map;
end
methods
function obj=MyPar()
obj.map=containers.Map('KeyType','double','ValueType','any');
end
function y=compute(obj,n)
if ~obj.map.isKey(n)
obj.map(n)=sin(n);
fprintf('Did not find key ''%d''\n',n)
else
fprintf('Found key ''%d''\n',n)
end
y=obj.map(n);
end
end
methods(Static)
function R=test()
c=MyPar();
Nworkers=3;
A=ones(Nworkers,2);
spmd(Nworkers)
R=c.compute(A(labindex,1))+c.compute(A(labindex,2));
end
end
end
end
Lauf MyPar.test()
>> MyPar.test();
Lab 1:
Did not find key '1'
Found key '1'
Lab 2:
Did not find key '1'
Found key '1'
Lab 3:
Did not find key '1'
Found key '1'
In diesem trivialen Beispiel gibt, würde ich wünschen, einen Code haben, wo zwei der drei Arbeiter don‘ t müssen ihre eigenen Berechnungen überhaupt durchführen (weil die einzige jemals durchgeführte Berechnung compute(1)
ist)
Danke für die Antwort. Ihr Vorschlag ist technisch möglich, da bin ich mir sicher. Ich konnte einfach nicht die Motivation finden, meinen laufenden Code zu verlassen, ohne zu wissen, dass es unmöglich ist, was ich will. Sie haben Recht, ich weiß nicht einmal, welche Sockets sind, also wird eine Vorverarbeitung die einfachste Lösung sein – Bananach