Main Content

Optimization Toolbox での並列計算とは

並列最適化機能

並列計算は 1 つの問題に対して複数のプロセッサを使用する手法です。並列計算を使用する利点は計算速度にあります。

以下に挙げる Optimization Toolbox™ のソルバーは、目的関数と非線形制約関数の数値的な勾配推定を複数のプロセッサへ自動的に分配します。

  • fmincon

  • fminunc

  • fgoalattain

  • fminimax

  • fsolve

  • lsqcurvefit

  • lsqnonlin

これらのソルバーは以下の条件の下で並列の勾配推定を行います。

  • Parallel Computing Toolbox™ のライセンスを所有している

  • オプション SpecifyObjectiveGradientfalse に設定されている、または非線形制約関数がある場合に、オプション SpecifyConstraintGradientfalse に設定されている場合。false はこれらのオプションの既定値であるため、設定する必要はありません。ただし、両方を true には設定しないでください。

  • 並列計算が Parallel Computing Toolbox の関数 parpool により有効化されている

  • オプション UseParalleltrue に設定されている場合。このオプションの既定値は false です。

これらの条件を満たすとき、ソルバーは並列処理で推定勾配を計算します。

メモ

並列で実行する場合でも、ソルバーはホスト マシンで目的関数と非線形制約関数を逐次的に呼び出すことがあります。このため、関数が逐次的または並列のいずれで評価されるのかについて、仮定がなされていないことを確認してください。

勾配の並列推定

1 つのソルバー サブルーチンは自動的に並列計算されます。このサブルーチンは、目的関数と制約関数の勾配を推定します。この計算は現在位置 x のまわりの点の関数値計算も行います。基本的に計算は以下になります。

f(x)[f(x+Δ1e1)f(x)Δ1,f(x+Δ2e2)f(x)Δ2,,f(x+Δnen)f(x)Δn],

ここで、

  • f は目的関数または制約関数

  • ei は単位方向ベクトル

  • Δi は ei 方向のステップ サイズ

並列で ∇f(x) を推定するために、Optimization Toolbox のソルバーは (f(x + Δiei) – f(x))/Δi の評価計算を追加のプロセッサへ分配します。

並列の中心差分

既定の前方有限差分の代わりに、中心有限差分によって勾配を推定することもできます。基本的な中心有限差分式は以下になります。

f(x)[f(x+Δ1e1)f(xΔ1e1)2Δ1,,f(x+Δnen)f(xΔnen)2Δn].

中心有限差分は前方有限差分の 2 倍の回数の関数評価を必要としますが、一般に精度がよくなります。中心有限差分は前方有限差分とまったく同じ様に並列処理されます。

optimoptions を使用して FiniteDifferenceType オプションを 'central' に設定し、中心有限差分法を有効にします。前進有限差分法を使用するには、FiniteDifferenceType オプションを 'forward' に設定します。

入れ子形式の並列関数

ソルバーは Parallel Computing Toolbox の関数 parfor (Parallel Computing Toolbox) を使用して勾配の並列推定を実行します。parfor は他の parfor ループから呼び出されると並列に処理されません。そのため目的関数と制約関数内で並列勾配推定と並列機能を同時に使用することはできません。

メモ

ドキュメンテーションでは、Simulink® を呼び出す場合は parfor または parfeval を使用しないように推奨されています。parfor 内での関数 sim の使用 (Simulink)を参照してください。そのため、ソルバーの組み込み並列機能を使用して Simulink シミュレーションを並列で最適化すると問題が発生する可能性があります。

たとえば、目的関数 userfcnparfor を呼び出し、ループ内で fmincon を呼び出す場合を考えてみましょう。また、並列最適化機能で示されている fmincon の並列勾配推定の条件が満たされているものとします。parfor を並列で実行した場合は 3 つのケースを示します。

  1. 最も外側のループは parfor です。そのループのみを並列に実行します。

  2. 最も外側の parfor ループは fmincon 内にあります。fmincon のみを並列に実行します。

  3. 最も外側の parfor ループは userfcn 内にあります。userfcn は並列に parfor を使用することができます。

parfor を並列で実行した場合

Parfor can run in parallel only in the outermost loop

参考

| |