Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB Function ブロックからの生成コード内の線形代数の高速化

MATLAB Function ブロック内の特定の線形代数関数について生成されるコードの実行速度を向上させるには、LAPACK 呼び出しをコード ジェネレーターで作成するように指定します。LAPACK は数値線形代数のソフトウェア ライブラリです。コード ジェネレーターは LAPACK への LAPACKE C インターフェイスを使用します。LAPACK 呼び出しを生成すると指定し、線形代数関数の入力配列が特定の基準を満たす場合、コード ジェネレーターは LAPACK 呼び出しを生成します。それ以外の場合は、コード ジェネレーターは線形代数関数のコードを生成します。

コード ジェネレーターは指定の LAPACK ライブラリを使用します。実行環境に合わせて最適化された LAPACK ライブラリを指定します。netlib.org/lapack/faq.html#_what_and_where_are_the_lapack_vendors_implementations を参照してください。

LAPACK ライブラリの指定

LAPACK 呼び出しを生成するには、LAPACK コールバック クラスにアクセスできなければなりません。LAPACK コールバック クラスは、LAPACK 呼び出しの LAPACK ライブラリと LAPACKE ヘッダー ファイルを指定します。LAPACK 呼び出しを生成して、特定の LAPACK ライブラリを使用することを示すには、LAPACK コールバック クラスの名前を指定します。[コンフィギュレーションパラメーター] ダイアログ ボックスで、[カスタム LAPACK ライブラリのコールバック] を、たとえば useMyLAPACK のようなコールバック クラスの名前に設定します。

LAPACK コールバック クラスの記述

特定の LAPACK ライブラリと LAPACKE ヘッダー ファイルの場所を指定するには、LAPACK コールバック クラスを記述します。生成されたコードで LAPACK 呼び出しに LAPACK ライブラリを使用するユーザーと、このコールバック クラスを共有します。

コールバック クラスは抽象クラス coder.LAPACKCallback から派生しなければなりません。このコールバック クラスの例をテンプレートとして使用します。

classdef useMyLAPACK < coder.LAPACKCallback
    methods (Static)
        function hn = getHeaderFilename()
            hn = 'mylapacke_custom.h';
        end
        function updateBuildInfo(buildInfo, buildctx)
            buildInfo.addIncludePaths(fullfile(pwd,'include'));
            libName = 'mylapack';
            libPath = fullfile(pwd,'lib');
            [~,linkLibExt] = buildctx.getStdLibInfo();
            buildInfo.addLinkObjects([libName linkLibExt], libPath, ...
                '', true, true);
            buildInfo.addDefines('HAVE_LAPACK_CONFIG_H');
            buildInfo.addDefines('LAPACK_COMPLEX_STRUCTURE');
            buildInfo.addDefines('LAPACK_ILP64'); 
        end
    end
end

getHeaderFilename メソッドと updateBuildInfo メソッドを指定しなければなりません。getHeaderFilename メソッドは LAPACKE ヘッダー ファイル名を返します。コールバック クラスの例では、mylapacke_custom.h を使用する LAPACKE ヘッダー ファイルの名前に置き換えます。updateBuildInfo メソッドは LAPACK ライブラリにリンクするビルド プロセスに必要な情報を提供します。テンプレートにあるコードと同様のコードを使用して、ヘッダー ファイルの場所と LAPACK ライブラリの絶対パス名を指定します。コールバック クラスの例では、mylapack を使用する LAPACK ライブラリの名前に置き換えます。

コンパイラが構造体として表される複素数データ型のみをサポートしている場合は、updateBuildInfo メソッドに次の行を含めます。

buildInfo.addDefines('HAVE_LAPACK_CONFIG_H');
buildInfo.addDefines('LAPACK_COMPLEX_STRUCTURE');

LAPACK ライブラリが使用する整数型を指定しなければなりません。この整数型を指定しないと、結果として不正確な動作やクラッシュが生じる可能性があります。次のいずれかを行います。

  • updateBuildInfo メソッドにこれらの行を含めます。

    buildInfo.addDefines('HAVE_LAPACK_CONFIG_H');
    buildInfo.addDefines('LAPACK_ILP64');

  • または、LAPACK ライブラリが使用する整数型を直接指定することもできます。たとえば、整数型が long long である場合、updateBuildInfo メソッドにこの行を含めます。

    buildInfo.addDefines('lapack_int=long long');

LAPACK コールバック クラスを指定した LAPACK 呼び出しの生成

この例では、特定の LAPACK ライブラリの LAPACK 関数を呼び出すコードを生成する方法を示します。この例では、LAPACK コールバック クラス useMyLAPACK が必要な LAPACK ライブラリを指定すると仮定します。

  1. Simulink® モデルを作成します。

  2. MATLAB Function ブロックをモデルに追加します。

  3. MATLAB Function ブロックに、線形代数関数を呼び出すコードを追加します。たとえば、MATLAB® 関数 svd を呼び出す関数 mysvd を追加します。

    function s = mysvd(A)
        %#codegen
        s = svd(A);
    end

  4. MATLAB Function ブロックの左に Constant ブロックを追加します。値を zeros(500) に設定します。

  5. MATLAB Function ブロックの右に Outport ブロックを追加します。

  6. ブロックを結線します。

  7. [コンフィギュレーション パラメーター][コード生成][詳細設定パラメーター][カスタム LAPACK ライブラリのコールバック] パラメーターを useMyLAPACK に設定します。

    コールバック クラスは MATLAB パス上になければなりません。

  8. モデルを作成します。

mysvd への入力が十分に大きい場合、コード ジェネレーターは svd の LAPACK 呼び出しを生成します。svd の LAPACK ライブラリ関数の呼び出しの例を示します。

info_t = LAPACKE_dgesvd( ...
     LAPACK_COL_MAJOR, 'N', 'N', (lapack_int)500, ...
     (lapack_int)500, &A[0], (lapack_int)500, &S[0], ...
     NULL, (lapack_int)1, NULL,(lapack_int)1, &superb[0]);

実行環境での LAPACK ライブラリの場所指定

実行環境で LAPACK ライブラリを利用できなければなりません。LAPACK ライブラリが共有されている場合、環境変数またはリンカー オプションを使用して LAPACK ライブラリの場所を指定します。

  • Windows® プラットフォームでは、PATH 環境変数を編集します。

  • Linux® プラットフォームでは、LD_LIBRARY_PATH 環境変数を修正するか、rpath リンカー オプションを使用します。

  • macOS プラットフォームでは、DYLD_LIBRARY_PATH 環境変数を修正するか、rpath リンカー オプションを使用します。

rpath リンカー オプションを指定するには、coder.LAPACKCallback クラスの updateBuildInfo メソッド内のビルド情報 addLinkFlags メソッドを使用します。たとえば、GCC コンパイラの場合、次のようになります。

buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));

参考

関連するトピック

外部の Web サイト