-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 つのコアがあります) を開いて、各セッションで個別にコードを実行できますか? 1 つのセッションで実行する場合の 4 倍のパフォーマンスが得られますか? (または、並列化されたコードと同じパフォーマンスが得られますか? - 並列コードではインライン関数を定義できません -) (Windows の場合)

4

1 に答える 1

1

問題を分離して 4 つのセッションで別々に実行する作業を行う準備ができている場合は、結果を再構築します。確実に実行できます。(Windows での) 私の経験では、4 つのワーカーで parfor ループを実行するよりも、4 つの個別のセッションでコードを実行する方が実際には高速に実行されます。オペレーティング システムには他の作業があるため、単一セッションの 4 倍のパフォーマンスほど高速ではありません。たとえば、プロセッサを大量に消費するアプリケーションを他に実行していない場合、OS 自体が 1 つのコアの 25% を占有する可能性があります。 、おそらく 1 つのセッションの 3.75 倍のパフォーマンスが得られます。ただし、これは十分なメモリがあることを前提としており、制限要因にはなりません。

これを定期的に行いたい場合は、ファイルベースのシグナル伝達/データ受け渡しシステムを作成する必要があるかもしれません。

これは明らかに ほどエレガントではありませんがparfor、状況に応じて、または並列ツールボックスのライセンス料を支払う余裕がない場合に使用できます。

于 2013-04-07T18:56:08.593 に答える