-1

我有一个脚本,可以为 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 上)

4

1 回答 1

1

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

如果您想定期执行此操作,您可能需要创建一些基于文件的信令/数据传递系统。

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

于 2013-04-07T18:56:08.593 回答