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