Main Content

リアルタイム アプリケーションの最適化コード生成

生成コードの時間制限

組み込みアプリケーションには、コードが実行されて解を返すまでの時間を制限する要件がある場合があります。ソルバーでは最適化にかかる時間が保証されないため、このような要件は問題になる可能性があります。このトピックでは、組み込みコードが実行されて結果を返すまでの時間を推定する手法を紹介し、所要時間を短縮するために行うことのできるコード変更について説明します。

コード生成のための効率的なコード記述に関する一般的なアドバイスについては、コード生成用の MATLAB コード設計における注意事項 (MATLAB Coder)を参照してください。

ターゲット環境に合わせる

コードを生成する前に生成コードの実行時間を推定するには、MATLAB® 環境を可能な限りターゲット環境に合わせて設定します。

  • ターゲット ハードウェアとご利用のコンピューターのクロック速度をチェックします。それに応じて、ベンチマーク結果をスケーリングします。

  • MATLAB Coder™ によって生成される既定の LAPACK および BLAS ライブラリはシングル スレッドであるため、MATLAB で maxNumCompThreads を 1 に設定します。

    lastN = maxNumCompThreads(1);

    ベンチマークが終了したら、次のように maxNumCompThreads の値をリセットします。

    N = maxNumCompThreads(lastN);
    % Alternatively,
    % N = maxNumCompThreads('automatic');

    メモ

    ターゲット ハードウェアが複数のコアを搭載しており、カスタム マルチスレッド LAPACK および BLAS ライブラリを使用する場合、maxNumCompThreads をターゲット ハードウェアのスレッド数に設定します。詳細については、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。

  • Embedded Coder® ライセンスをお持ちの場合は、組み込みコードによって得られるパフォーマンスを評価する信頼できる方法を詳しく説明しているトピック (MATLAB Function ブロックからの生成コード内の線形代数の高速化 (Embedded Coder)MATLAB Function ブロックからの生成コード内の行列演算の高速化 (Embedded Coder)検証 (Embedded Coder)パフォーマンス (Embedded Coder)) を参照してください。

コーダーの構成を設定する

コード生成の構成を設定するには、coder.config を呼び出します。

cfg = coder.config('mex');

生成コードの時間を短縮するには、整合性チェックと整数飽和チェックをオフにします。これらのチェックが目的関数と非線形制約関数で必要なければ、ソルバーはこれらのチェックに依存することなく正常に動作します。詳細については、実行時チェックの制御 (MATLAB Coder)を参照してください。

cfg.IntegrityChecks = false;
cfg.SaturateOnIntegerOverflow = false;

通常、生成コードは静的メモリ割り当てを使用した方が高速に実行されます。ただし、この割り当てにより、生成コードの量が増えることがあります。また、ハードウェアによっては、動的メモリ割り当てをサポートしていません。静的メモリ割り当てを使用するには、次の設定を指定します。

cfg.DynamicMemoryAllocation = 'Off';

異なる種類の BLAS (基礎となる線形代数サブプログラム) を選択することで、コードのパフォーマンスを高められます。生成コードの BLAS を設定する方法については、生成されたスタンドアロン コードでの BLAS 呼び出しを使用した行列演算の高速化 (MATLAB Coder)を参照してください。組み込みアプリケーションを並列実行する場合は、ご利用のシステムでの並列計算をサポートする BLAS ライブラリまたは LAPACK ライブラリを指定しなければなりません。同様に、並列ハードウェアをお持ちの場合は、カスタム LAPACK 呼び出しを設定することで、コードのパフォーマンスを高められます。詳細については、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。

ソルバーのベンチマーク

アプリケーションの一連の典型的な入力パラメーターを使用し、評価を 1000 回行うループで MEX 生成コードを実行します。評価時間の合計時間と最大値の両方を求めます。ソルバーに時間がかかりすぎそうなパラメーターやその他のパラメーターを試してテストします。MEX アプリケーションで満足できる結果が妥当な時間内に返されたら、展開済みアプリケーションでも同様になることが期待できます。

初期点の設定

実行時間と解の質の両方に影響を与える重要な要素の 1 つが、最適化の初期点 x0 です。ソルバー呼び出しの間にパラメーターが徐々に変化する場合、通常は前回の呼び出しでの解が次の呼び出しの適切な開始点になります。パラメーターの変化に応じた方程式の解の追跡を参照してください。解で引き込み領域が切り替わることで、求解の所要時間が急に変化する仕組みについても説明しています。

徐々に変化するパラメーターがなく、制御変数がわずかしかない最適化問題であれば、以前の解から応答を推定してみる価値がある場合があります。パラメーターの関数として、解のモデルを作成します。これは、パラメーターの二次関数または低次元の内挿として作成します。また、予測される解の点をソルバーの開始点として使用します。

オプションを適切に設定する

パラメーターの調整により、解を求める速度を改善できる場合があります。反復回数をわずか数回に抑えるように MaxIterations オプションを設定した場合、ソルバーはすぐに停止します。たとえば、ソルバーが fmincon であれば、次のコードを入力します。

opts = optimoptions('fmincon','Algorithm','sqp','MaxIterations',50);
[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

ただし、結果が最適解とかけ離れる可能性があります。精度の低い結果がシステム全体に影響を与えないようにします。時間の制約の範囲内で、MaxIterations を可能な限り大きく設定します。この値を推定するには、反復にかかる時間か関数評価にかかる時間を測定し、MaxFunctionEvaluations オプションか MaxIterations オプションを設定します。例については、最適化のためのコード生成の基本を参照してください。

ソルバーを高速化する設定に関する詳しいヒントについては、ソルバーの時間がかかりすぎるを参照してください。ただし、コード生成における制限のため、このトピックのヒントの中には適用できないものがあることに注意してください。fmincon でのコード生成の背景またはquadprog 用のコード生成の背景を参照してください。

大域的最小値

解として、単なる局所的最小値ではなく、大域的最小値が必要な場合があります。大域的最小値の検索には相当の時間がかかる可能性があり、うまくいく保証もありません。ヒントについては、より小さい最小値の検索を参照してください。

参考

| (MATLAB Coder) | |

関連するトピック