Ускорьте линейную алгебру в коде, сгенерированном от блока MATLAB function

Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в блоке MATLAB function, укажите, что генератор кода производит вызовы LAPACK. LAPACK является библиотекой программного обеспечения в числовой линейной алгебре. Генератор кода использует интерфейс LAPACKE C для LAPACK. Если вы указываете, что хотите сгенерировать вызовы LAPACK, и входные массивы для функций линейной алгебры соответствуют определенным критериям, генератор кода производит вызовы LAPACK. В противном случае генератор кода производит код для функций линейной алгебры.

Генератор кода пользуется библиотекой LAPACK, которую вы задаете. Задайте библиотеку LAPACK, которая оптимизирована для вашей среды выполнения. См. www.netlib.org/lapack/faq.html#_what_and_where_are_the_lapack_vendors_implementations.

Задайте библиотеку LAPACK

Чтобы сгенерировать вызовы LAPACK, у вас должен быть доступ к классу коллбэка LAPACK. Класс коллбэка LAPACK задает библиотеку LAPACK и заголовочный файл LAPACKE для вызовов LAPACK. Чтобы указать, что вы хотите сгенерировать вызовы LAPACK и что вы хотите пользоваться определенной библиотекой LAPACK, задайте имя класса коллбэка LAPACK. В диалоговом окне Configuration Parameters, набор Custom LAPACK library callback к имени класса коллбэка, например, 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');
        end
    end
end

Необходимо предоставить методы updateBuildInfo и getHeaderFilename. Метод getHeaderFilename возвращает имя заголовочного файла LAPACKE. В классе коллбэка в качестве примера замените mylapacke_custom.h на имя вашего заголовочного файла LAPACKE. Метод updateBuildInfo предоставляет информацию, запрошенную для процесса сборки, чтобы соединиться с библиотекой LAPACK. Используйте код как код в шаблоне, чтобы задать местоположение заголовочных файлов и имя полного пути библиотеки LAPACK. В классе коллбэка в качестве примера замените mylapack на имя вашей библиотеки LAPACK.

Если ваш компилятор поддерживает только сложные типы данных, которые представлены как структуры, включают эти строки в метод updateBuildInfo.

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

Сгенерируйте вызовы LAPACK путем определения класса коллбэка LAPACK

Этот пример показывает, как сгенерировать код, который вызывает функции LAPACK в определенной библиотеке LAPACK. В данном примере примите, что класс коллбэка LAPACK, useMyLAPACK задает библиотеку LAPACK, которую вы хотите.

  1. Создайте модель Simulink®.

  2. Добавьте блок MATLAB function в модель.

  3. В блоке MATLAB function добавьте код, который вызывает функцию линейной алгебры. Например, добавьте функциональный mysvd, который вызывает функцию MATLAB® svd.

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

  4. Добавьте блок Constant слева от блока MATLAB function. Установите значение к zeros(500).

  5. Добавьте блок Outport справа от блока MATLAB function.

  6. Соедините блоки.

  7. Установите Configuration Parameters> Code Generation> Advanced parameters> параметр Custom LAPACK library callback к useMyLAPACK.

    Класс коллбэка должен быть на пути MATLAB.

  8. Создайте модель.

Если вход к mysvd является достаточно большим, генератор кода производит призыв LAPACK К svd. Пример вызова библиотечной функции LAPACK для svd:

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, можно использовать информацию о сборке метод addLinkFlags в методе updateBuildInfo класса coder.LAPACKCallback. Например, для компилятора GCC:

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

Смотрите также

Похожие темы

Внешние веб-сайты