2016-04-27 18 views
2

設置MATLAB:如何分享一個HashMap並行計算

我試圖並行運行在矩陣中的每一行相同的代碼的算法

(然後後續加工的結果。)在多行處理中會發生一些計算(這種再次發生很難預測)。

因此,目前我調用一個執行這些計算並將結果保存在HashMap中的對象,所以當處理行$ n $需要已經爲行$ m $進行的計算時,他們不需要再次完成。

它不會影響處理行的順序的算法結果。

問題

我不能夠使用HashMap的並行代碼,每個工人都有自己的HashMap結束。

我明白這種行爲背後的哲學。然而在我的例子中,順序並不重要,我想繞過標準的行爲。

最小工作示例

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 

運行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' 

在這個簡單的例子,我會希望有一個代碼,其中兩個三個工人穿上」 t需要自己完成計算(因爲有史以來唯一的計算是compute(1)

回答

1

Matlab's並行計算並不完全按照這種方式工作 - 迭代彼此獨立。理論上,你可以通過例如在工作人員之間來回傳遞數據。套接字(很好的例子here),但這對於你的任務可能是一種矯枉過正,增加的開銷甚至可能超過了這個好處。

你有沒有考慮將你的邏輯分成幾個部分?使用你的簡單例子,你可以首先找到一組需要進行計算的矩陣元素。在parfor循環中運行所有這些計算,將結果保存到簡單數組或單元數組(如果每次迭代的結果不是單個數字)。然後,您可以將其餘的邏輯應用於這些結果。

+0

感謝您的回答。我確信你的建議在技術上是可行的。我無法找到放棄我的運行代碼的動機,因爲我不知道我想要的是不可能的。你是對的,我甚至不知道插座是什麼,所以做一些預處理將是最簡單的解決方案 – Bananach