coder.fftw.StandaloneFFTW3Interface.lock

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

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

Синтаксис

coder.fftw.StandaloneFFTW3Interface.lock()

Описание

coder.fftw.StandaloneFFTW3Interface.lock() блокирует доступ к процессу планирования для вызовов библиотеки 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

Запись класса коллбэка FFT 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® Кодер, установите эти параметры:

    • 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