设置
我正在尝试并行化一个算法,该算法在矩阵的每一行上运行相同的代码(然后对结果进行后处理。)
在处理多行时会发生一些计算(这种重现很难预测)。
因此,目前我调用一个执行这些计算的对象并将结果保存在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)
)
答案 0 :(得分:1)
Matlab的并行计算并不是这样做的 - 迭代是彼此独立的。理论上,您可以通过例如工作人员在工作人员之间来回传递数据套接字(很好的例子here),但这可能对你的任务来说太过分了,增加的开销甚至可能超过收益。
您是否考虑将逻辑拆分为几个部分?使用您的简单示例,您可以首先找到执行计算所需的一组唯一矩阵元素。在parfor
循环中运行所有这些计算,将结果保存到一个简单数组或单元数组中(如果每次迭代的结果不是单个数字)。然后,您可以将其余逻辑应用于这些结果。