Ускорение линейной алгебры в коде, сгенерированном из блока 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. В диалоговом окне Параметров конфигурации задайте 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');
            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.

  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® платформа, измените переменный ПУТЬ окружения.

  • На Linux® платформы, измените переменную окружения LD_LIBRARY_PATH или используйте rpath опция linker.

  • На платформе macOS измените переменную окружения DYLD_LIBRARY_PATH или используйте rpath опция linker.

Чтобы задать rpath опция linker, вы можете использовать информацию о сборке addLinkFlags метод в updateBuildInfo метод вашего coder.LAPACKCallback класс. Для примера, для компилятора GCC:

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

См. также

Похожие темы

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