2016-04-27 6 views
2

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)

Antwort

1

Matlab Paralleles Rechnen funktioniert nicht ganz so - Iterationen sind unabhängig voneinander. Sie könnten theoretisch Daten zwischen Arbeitern über z. Sockets (gutes Beispiel here), aber das ist wahrscheinlich ein Overkill für Ihre Aufgabe, und zusätzliche Overhead kann sogar den Nutzen überwiegen.

Haben Sie darüber nachgedacht, Ihre Logik in mehrere Teile aufzuteilen? Mit Ihrem einfachen Beispiel könnten Sie zuerst einen eindeutigen Satz von Matrixelementen finden, für den Sie Berechnungen durchführen müssen. Führen Sie alle diese Berechnungen in einer parfor-Schleife aus und speichern Sie die Ergebnisse in einem einfachen Array oder einem Zellenarray (wenn das Ergebnis jeder Iteration etwas anderes als eine einzelne Zahl ist). Sie können dann den Rest Ihrer Logik auf diese Ergebnisse anwenden.

+0

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

Verwandte Themen