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

MATLAB:如何在并行计算中共享HashMap,matlab,parallel-processing,Matlab,Parallel Processing,设置 我正在尝试并行化一个算法,该算法在矩阵的每一行上运行相同的代码(然后对结果进行后处理) 在处理多行时会发生一些计算(这种情况很难预测) 因此,目前我调用一个执行这些计算并将结果保存在HashMap中的对象,因此当处理行$n$时,需要对行$m$进行已经完成的计算,而不需要再次进行 它不会影响行处理顺序的算法的结果 问题 我无法在并行代码中使用HashMap,每个工作程序最终都有自己的HashMap 我理解这种行为背后的哲学。然而在我的例子中,秩序并不重要,我想绕过标准行为 最小工作示例 cl

设置

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

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

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

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

Matlab的并行计算不是这样工作的——迭代是相互独立的。从理论上讲,您可以通过套接字(很好的示例)在工作人员之间来回传输数据,但这对您的任务来说可能是一种过度的操作,增加的开销甚至可能超过其好处


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

谢谢您的回答。我相信你的建议在技术上是可行的。我就是找不到放弃我正在运行的代码的动机,因为我不知道这不可能是我想要的。你是对的,我甚至不知道套接字是什么,所以做一些预处理将是最简单的解决方案
>> 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'