2016-04-27 24 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