我试图并行运行在矩阵中的每一行相同的代码的算法
(然后后续加工的结果。)在多行处理中会发生一些计算(这种再次发生很难预测)。
因此,目前我调用一个执行这些计算并将结果保存在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)
)
感谢您的回答。我确信你的建议在技术上是可行的。我无法找到放弃我的运行代码的动机,因为我不知道我想要的是不可能的。你是对的,我甚至不知道插座是什么,所以做一些预处理将是最简单的解决方案 – Bananach