使用class(big size)属性的类方法中的Matlab并行化

时间:2019-05-31 16:41:52

标签: matlab oop parfor

我在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行)在...我的代码中。.

0 个答案:

没有答案