coder.fftw. StandaloneFFTW3Interface.unlock

Класс: coder.fftw. StandaloneFFTW3Interface
Пакет: coder.fftw

Разблокируйте доступ к планированию FFTW

Синтаксис

coder.fftw.StandaloneFFTW3Interface.unlock()

Описание

coder.fftw.StandaloneFFTW3Interface.unlock() разблокировал доступ к планированию вызовов библиотеки FFTW в сгенерированном автономном коде.

Когда несколько потоков вызывают библиотеку FFTW, реализуют этот метод в классе коллбэка библиотеки FFT, который выводит от coder.fftw.StandaloneFFTW3Interface.

Примеры

развернуть все

В классе, который выводит от coder.fft.StandaloneFFTW3Interface, реализация lock и методы unlock, которые вызывают код С, чтобы управлять блокировкой.

Запишите функции C, которые инициализируют, устанавливают и сбрасывают блокировку. Чтобы управлять блокировкой, этот пример пользуется библиотекой OpenMP. Для различной библиотеки измените код соответственно.

  • Создайте файл 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

Запишите классу коллбэка БПФ myfftcb что:

  • Задает библиотеку FFTW.

  • lock реализаций и методы unlock, которые вызывают код С поддержки, чтобы управлять доступом к планированию FFTW.

Используйте этот класс в качестве шаблона. Замените 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, набором:

    • Custom FFT library callback к myfftcb.

    • Additional source files к mylock.c.

    • Initialize function к mylock_initialize();.

  • Для генерации кода от блока MATLAB function при помощи Simulink® Coder, установленного эти параметры:

    • Custom FFT library callback к myfftcb.

    • В Code Generation > Custom Code, под Additional build information, устанавливает Source files на mylock.c.

    • В Code Generation > Custom Code, под Insert custom C code in generated, устанавливает Initialize function на mylock_initialize();.

Сгенерируйте код.

Введенный в R2017b