代码之家  ›  专栏  ›  技术社区  ›  Mostafa

我可以在多个MATLAB会话上运行脚本而不是并行化脚本吗?

  •  -1
  • Mostafa  · 技术社区  · 13 年前

    我有一个脚本,它在for循环中求解许多参数的微分方程组。(迭代是完全独立的,但在每次迭代结束时,根据计算结果修改一个大矩阵(mat))。这是代码:(B是一个包含参数的矩阵)

       mat=zeros(20000,1);
    
       for n=1:20000         
    
    
             prop=B(n,:); % B is a (20000 * 2 ) matrix  that contains U and V parameters
             U=prop(1);
             V=prop(2);
    
    
             options=odeset('RelTol',1e-6,'AbsTol',1e-20);
             [T,X]=ode45(@acceleration,tspan,x0,options);
    
             rad=X(:,1);
             if max(rad)<radius   % radius is a constant
            mat(n)=1;
    
          end
    
          function xprime=acceleration(T,X)
          .
          .
          .
          end
    

    首先,我尝试使用parfor,但由于加速函数(ode45输入)被定义为内联函数,(为了获得更好的性能)我无法做到这一点。

    我可以打开4个MATLAB会话(我的CPU有4个内核)并在每个会话中单独运行代码,而不是修改代码以将加速作为一个单独的函数来实现,因此,使用parfor吗?它的性能是一次训练的4倍吗?(或者它能提供与并行代码相同的性能吗?-在并行代码中,我不能定义内联函数-) (在Windows上)

    1 回复  |  直到 13 年前
        1
  •  1
  •   pancake    13 年前

    如果你准备将问题分离出来,在4个会话中单独运行,然后重新组合结果,那么你一定能做到。根据我的经验(在Windows上),在四个独立的会话中运行代码实际上比使用4个工人的parfor循环运行得更快。不如单次会话的4倍性能快,因为操作系统还有其他工作要做……因此,例如,如果没有其他处理器密集的应用程序运行,操作系统本身可能会占用一个核心的25%,使您的单次会话性能可能达到3.75倍。然而,这是假设您有足够的内存,而不是限制因素。

    如果你想定期这样做,你可能需要创建一些基于文件的信号/数据传递系统。

    这显然不如 parfor ,但对于您的情况是可行的,或者如果您负担不起并行工具箱的许可费。