並列計算によるパフォーマンスの向上
スピードに影響を与える要因
いくつかの要因が並列処理の実行速度に影響を与えます。
並列オーバーヘッド。
for
の代わりのparfor
の呼び出しにオーバーヘッドがあります。関数評価が速い場合、このオーバーヘッドがかなりの量になる可能性があります。特に、並列で問題を解く場合でもその問題を逐次的に解く場合より遅くなることもあります。入れ子形式の
parfor
ループは使えません。これは 入れ子形式の並列関数 で説明されています。parfor
は他のparfor
ループから呼び出された場合は並列処理を行いません。並列処理を利用して目的関数または制約関数をプログラミングした場合、parfor
ループを入れ子で使用できないという制限により、ソルバーの実行が予想以上に遅くなる可能性があります。特に有限差分の並列計算は、外側のループであるため優先されます。これにより、目的関数または制約関数内の任意の並列コードが逐次的に実行されます逐次実行した場合、
parfor
ループはfor
ループよりも実行が遅くなります。したがって、最良のパフォーマンスを得るには、最も外側のループのみがparfor
を呼び出すようにします。たとえば、コードがparfor
ループ内でfmincon
を呼び出すとします。この場合に最良のパフォーマンスを得るには、fmincon
UseParallel
オプションをfalse
に設定します。渡されるパラメーター。パラメーターは並列計算の実行中に自動的にワーカー マシンに渡されます。パラメーターが多数ある場合、またはパラメーターが大量のメモリを使用する場合、パラメーターを渡すと計算の実行が遅くなる可能性があります。
ネットワークと計算のリソースの競合。ワーカー マシンのネットワークが低帯域幅である場合やレイテンシが高い場合、計算が遅くなる可能性があります。
結果に影響を与える要因
並列処理を使用すると、いくつかの要因が数値結果に影響を与えます。並列 for ループ (parfor) (Parallel Computing Toolbox)には、parfor
に関連する注意事項がいくつか記載されています。
永続変数またはグローバル変数。目的関数または制約関数が変数 persistent またはグローバル変数を使用する場合、これらの変数はワーカー プロセッサによって異なる値を取る可能性があります。さらに、これらはワーカー プロセッサ上で適切に消去されない可能性があります。ソルバーは、サイズ不一致などのエラーをスローすることがあります。
外部ファイルへのアクセス。外部ファイルは並列処理中に予期しない方法でアクセスされる可能性があります。並列処理中は計算順序は保証されません。そのため外部ファイルは予期しない順番でアクセスされ、予期しない結果につながる可能性があります。
外部ファイルへのアクセス。2 つ以上のプロセッサが外部ファイルを同時に読み取ろうとすると、ファイルはロックされ、読み取りエラーが起こる可能性があります。その場合、最適化の実行は停止します。
目的関数が Simulink® を呼び出す場合、結果は並列の勾配推定を使用すると信頼性のないものになる可能性があります。
input
、plot
、keyboard
のような計算をしない関数は、目的関数や制約関数で使用すると、うまく処理されない可能性があります。parfor
ループで呼び出された場合、これらの関数はワーカー マシンで実行されます。これにより、ワーカーは入力待ちの状態になり応答しなくなることがあります。parfor
はbreak
またはreturn
ステートメントを受け付けません。
大域的な最適解の検索
大域的な最適解を見つけるための 1 つの方法は、さまざまな初期点からのソルバーを実行することです。関数 parfor
を使用して、これらの実行をいくつかのプロセッサに分割する場合、parfor
ループは入れ子形式にできないため、並列勾配推定を無効にします。計算をすべてのプロセッサに振り分けた場合、最適化は通常、並列勾配推定による逐次処理よりも迅速に実施されます。つまり、並列推定の無効化による計算速度の低下はほぼありません。しかし、初期点より多くのプロセッサがある場合、並列の勾配推定をするより初期点を分配した方が良いかどうかは明確にわかりません。
Global Optimization Toolbox ライセンスをお持ちの場合は、MultiStart
(Global Optimization Toolbox) ソルバーを使用して、複数の開始点を並列で調べることができます。詳細については、並列計算 (Global Optimization Toolbox)と並列マルチスタート (Global Optimization Toolbox)を参照してください。