Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в автономном (библиотечная или исполняемая программа) код, укажите, что вы хотите, чтобы 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 набора к имени класса обратного вызова.
Чтобы задать местоположения конкретной библиотеки 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));