Main Content

coder.fftw.StandaloneFFTW3Interface.unlock

クラス: coder.fftw.StandaloneFFTW3Interface
名前空間: coder.fftw

FFTW 計画へのアクセスをロック解除する

構文

coder.fftw.StandaloneFFTW3Interface.unlock()

説明

coder.fftw.StandaloneFFTW3Interface.unlock() は、生成されたスタンドアロン コード内で、FFTW ライブラリ呼び出しの計画へのアクセスをロック解除します。

複数のスレッドが FFTW ライブラリを呼び出す場合、coder.fftw.StandaloneFFTW3Interface から派生する FFT ライブラリ コールバック クラスでこのメソッドを実装します。

すべて展開する

coder.fft.StandaloneFFTW3Interface から派生するクラスで、C コードを呼び出してロックを管理する lock メソッドと unlock メソッドを実装します。

ロックを初期化、設定、設定解除する C 関数を記述します。ロックを管理するために、次の例では OpenMP ライブラリを使用します。ライブラリが異なる場合は、それに応じてコードを変更してください。

  • 次の C コードを含むファイル mylock.c を作成します。

    #include "mylock.h"
    #include "omp.h"
    
    static omp_nest_lock_t lockVar;
    
    void mylock_initialize(void)
    {
        omp_init_nest_lock(&lockVar);
    }
    
    void mylock(void)
    {
        omp_set_nest_lock(&lockVar);
    }
    
    void myunlock(void)
    {
        omp_unset_nest_lock(&lockVar);
    }  

  • 次を含むヘッダー ファイル mylock.h を作成します。

    #ifndef MYLOCK_H
    #define MYLOCK_H
    
     void mylock_initialize(void);
     void mylock(void);
     void myunlock(void);
    
    #endif

次のような FFT コールバック クラス myfftcb を記述します。

  • FFTW ライブラリを指定する。

  • サポートする C コードを呼び出して FFTW 計画へのアクセスを制御する lock メソッドと unlock メソッドを実装する。

このクラスをテンプレートとして使用します。fftwLocation を FFTW ライブラリのインストール場所で置き換えます。

classdef myfftcb < coder.fftw.StandaloneFFTW3Interface
    
    methods (Static)
        function th = getNumThreads
            coder.inline('always');
            th = int32(coder.const(1));
        end
        
        function lock()
            coder.cinclude('mylock.h', 'InAllSourceFiles', true);
            coder.inline('always');
            coder.ceval('mylock');
        end
        
        function unlock()
            coder.cinclude('mylock.h', 'InAllSourceFiles', true);
            coder.inline('always');
            coder.ceval('myunlock');
        end
        
        function updateBuildInfo(buildInfo, ctx)
            fftwLocation = '\usr\lib\fftw';
            includePath = fullfile(fftwLocation, 'include');
            buildInfo.addIncludePaths(includePath);
            libPath = fullfile(fftwLocation, 'lib');
            
            %Double
            libName1 = 'libfftw3-3';
            [~, libExt] = ctx.getStdLibInfo();
            libName1 = [libName1 libExt];
            addLinkObjects(buildInfo, libName1, libPath, 1000, true, true);
            
            %Single
            libName2 = 'libfftw3f-3';
            [~, libExt] = ctx.getStdLibInfo();
            libName2 = [libName2 libExt];
            addLinkObjects(buildInfo, libName2, libPath, 1000, true, true);
            
        end
    end
end

コード生成コンフィギュレーション パラメーターを設定します。

  • MATLAB® Coder™codegen コマンドを使用したコード生成の場合、次のように設定します。

    • CustomFFTCallback'myfftcb' に。

    • CustomSource'mylock.c' に。

    • CustomInitializer'mylock_initialize();' に。

  • MATLAB Coder アプリを使用したコード生成の場合、次のように設定します。

    • [カスタム FFT ライブラリのコールバック]myfftcb に。

    • [追加ソース ファイル]mylock.c に。

    • [初期化関数]mylock_initialize(); に。

  • Simulink® Coder を使用して MATLAB Function ブロックからコードを生成する場合、次のパラメーターを設定します。

    • [カスタム FFT ライブラリのコールバック]myfftcb に。

    • [コード生成]、[カスタム コード][追加のビルド情報] で、[ソース ファイル]mylock.c に設定する。

    • [コード生成]、[カスタム コード][生成時に挿入するカスタム C コード] で、[初期化関数]mylock_initialize(); に設定する。

コードを生成します。

バージョン履歴

R2017b で導入