我在Matlab中有一个非常庞大的OOP代码,我试图通过瓶颈的并行化来加快运行速度。但是,它没那么容易。
请考虑以下简化情况
classdef MyClass < handle
properties
% big matrices
M1; %sparse
M2;
M3;
...
%objects
A; %Another Class Instance
...
end %properties
methods
function obj = MyClass(...)
...
obj.InitializeM1(...);
obj.CreateM2(...);
...
end
function Heavy(obj)
....
for i=1:N
obj.M3(:,i) = obj.UseM1(obj.M2(:,i))
end
end % Heavy
function out = UseM1(in)
...
tmp = obj.foo(in,obj.A.someProperty);
...
out = obj.bar(tmp);
end % UseM1
function foo(...)
...% also use some other class properties
end %foo
function bar(...)
...% also use some other class properties
end %bar
end % methods
end % MyClass
现在,我想用parfor将“ Heavy”中的循环并行化,但是Matlab不喜欢它。我以以下代码结束:
parfor i=1:N
tmp(:,i) = UseM1(obj,obj.M2(:,i))
end
obj.M3 = tmp;
Matlab同意运行它,但是在序列化时失败(请参见下面的“错误/警告消息”),即,它不知道将M1发送给工作人员。我想应该有一种方法只能发送一次(我相信每个工人)。
ps:我曾尝试使用Worker Object Wrapper,请参见Matlab's File Exchange,但没有成功。我不知道该如何正确使用它。
错误\警告消息:
警告:构造远程parfor代码时捕获到错误。的 parfor构造现在将在本地而不是在远程运行 并行池。造成这种情况的最可能原因是无法发送 由于序列化错误而向工作人员输入参数。的 捕获的错误的错误报告是:使用错误 parallel.internal.getJavaFutureResult(第33行) 等待60后,并行池可用于远程执行 秒。这可能是因为先前的SPMD块或PARFOR循环 无法正确完成并被中断,或者至少 一名工人正在忙于执行PARFEVAL。如果此问题仍然存在,则您 可能需要重新启动并行池。
parallel.internal.getJavaFutureInterruptible中的错误(第36行) 未来,1,java.util.concurrent.TimeUnit.SECONDS);
distcomp.remoteparfor中的错误(第138行) p = parallel.internal.getJavaFutureInterruptible(...
parallel_function中的错误> iMakeRemoteParfor(第1071行)P = distcomp.remoteparfor(pool,W,@make_channel,parfor_C);
parallel_function错误(第444行) [P,W] = iMakeRemoteParfor(pool,W,parfor_C);
...我的代码中存在错误...
parallel.internal.pool.serialize(第8行)中的错误已序列化= distcompserialize64(data);
distcomp.remoteparfor中的错误(第176行) serializedInitData = parallel.internal.pool.serialize(varargin,initDataBufSize);
parallel_function中的错误> iMakeRemoteParfor(第1071行)P = distcomp.remoteparfor(pool,W,@make_channel,parfor_C);
parallel_function错误(第444行) [P,W] = iMakeRemoteParfor(pool,W,parfor_C);
错误...我的代码...在parallel.internal.pool.serialize中(行 8)在distcomp.remoteparfor(行176)中 parallel_function> iMakeRemoteParfor(第1071行)in parallel_function (第444行)在...我的代码中。.