Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в автономном (библиотечная или исполняемая программа) код, укажите, что вы хотите, чтобы MATLAB® Coder™ сгенерировал вызовы LAPACK. LAPACK является библиотекой программного обеспечения в числовой линейной алгебре. MATLAB Coder использует интерфейс LAPACKE C для LAPACK. Если вы указываете, что хотите сгенерировать вызовы LAPACK, и входные массивы для функций линейной алгебры соответствуют определенным критериям, генератор кода производит вызовы LAPACK. В противном случае генератор кода производит код для функций линейной алгебры.
Для вызовов LAPACK в автономном коде MATLAB Coder пользуется библиотекой 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.
В командной строке, набор свойство объекта настройки кода CustomLAPACKCallback
к имени класса коллбэка.
В приложении MATLAB Coder, набор Custom LAPACK library callback к имени класса коллбэка.
Чтобы задать местоположения конкретной библиотеки 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, которой вы хотите пользоваться.
Запишите функцию MATLAB, которая вызывает функцию линейной алгебры. Например, запишите функциональный mysvd
, который вызывает функцию MATLAB svd
.
function s = mysvd(A) %#codegen s = svd(A); end
Задайте объект настройки кода для статической библиотеки, динамически подключаемой библиотеки или исполняемой программы. Например, задайте объект настройки для динамически подключаемой библиотеки на платформе Windows®.
cfg = coder.config('dll');
Задайте класс коллбэка LAPACK useMyLAPACK
.
cfg.CustomLAPACKCallback = 'useMyLAPACK';
Класс коллбэка должен быть на пути MATLAB.
Сгенерируйте код. Укажите, что вход A
500 500, массив удваивается.
codegen mysvd -args {zeros(500)} -config cfg -report
Если A
является достаточно большим, генератор кода производит призыв 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));