Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в блоке 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 и заголовочный файл LAPACKE для вызовов LAPACK. Чтобы указать, что необходимо сгенерировать вызовы LAPACK и использовать определенную библиотеку LAPACK, укажите имя класса коллбэка LAPACK. В диалоговом окне Параметров конфигурации задайте Custom LAPACK library callback имя класса коллбэка, для примера, useMyLAPACK.
Чтобы указать местоположение конкретной библиотеки 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 useMyLAPACK задает требуемую библиотеку LAPACK.
Создайте Simulink® модель.
Добавьте блок MATLAB Function к модели.
В блоке MATLAB Function добавьте код, который вызывает линейную алгебру функцию. Для примера добавьте функцию mysvd который вызывает MATLAB® функция svd.
function s = mysvd(A) %#codegen s = svd(A); end
Добавьте блок Constant слева от блока MATLAB Function. Установите значение равным zeros(500).
Добавьте блок Outport справа от блока MATLAB Function.
Соедините блоки.

Установите Configuration Parameters> Code Generation> Advanced parameters> Custom LAPACK library callback параметр к useMyLAPACK.
Класс коллбэка должен находиться в пути MATLAB.
Создайте модель.
Если вход в 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.
В 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));