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