このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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 ライブラリを指定すると仮定します。
Simulink® モデルを作成します。
MATLAB Function ブロックをモデルに追加します。
MATLAB Function ブロックに、線形代数関数を呼び出すコードを追加します。たとえば、MATLAB® 関数
svd
を呼び出す関数mysvd
を追加します。function s = mysvd(A) %#codegen s = svd(A); end
MATLAB Function ブロックの左に Constant ブロックを追加します。値を
zeros(500)
に設定します。MATLAB Function ブロックの右に Outport ブロックを追加します。
ブロックを結線します。
[コンフィギュレーション パラメーター] 、 [コード生成] 、 [詳細設定パラメーター] 、 [カスタム LAPACK ライブラリのコールバック] パラメーターを
useMyLAPACK
に設定します。コールバック クラスは MATLAB パス上になければなりません。
モデルを作成します。
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));