MATLAB:如何在并行计算中共享HashMap

时间:2016-04-27 13:56:18

标签: matlab parallel-processing

设置

我正在尝试并行化一个算法,该算法在矩阵的每一行上运行相同的代码(然后对结果进行后处理。)

在处理多行时会发生一些计算(这种重现很难预测)。

因此,目前我调用一个执行这些计算的对象并将结果保存在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'

在这个简单的例子中,我希望有一个代码,其中三个工作者中的两个根本不需要自己进行计算(因为唯一的计算是compute(1)

1 个答案:

答案 0 :(得分:1)

Matlab的并行计算并不是这样做的 - 迭代是彼此独立的。理论上,您可以通过例如工作人员在工作人员之间来回传递数据套接字(很好的例子here),但这可能对你的任务来说太过分了,增加的开销甚至可能超过收益。

您是否考虑将逻辑拆分为几个部分?使用您的简单示例,您可以首先找到执行计算所需的一组唯一矩阵元素。在parfor循环中运行所有这些计算,将结果保存到一个简单数组或单元数组中(如果每次迭代的结果不是单个数字)。然后,您可以将其余逻辑应用于这些结果。