Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в блоке 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. В диалоговом окне Configuration Parameters, набор 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'); 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, 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® измените переменную окружения PATH.
На платформе Linux® измените переменную окружения LD_LIBRARY_PATH или используйте опцию компоновщика rpath
.
На macOS платформе измените переменную окружения DYLD_LIBRARY_PATH или используйте опцию компоновщика rpath
.
Чтобы задать опцию компоновщика rpath
, можно использовать информацию о сборке метод addLinkFlags
в методе updateBuildInfo
класса coder.LAPACKCallback
. Например, для компилятора GCC:
buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));