Чтобы улучшить скорость выполнения кода, сгенерированного для определенных функций линейной алгебры в автономном (библиотечная или исполняемая программа) код, укажите, что вы хотите, чтобы MATLAB® Coder™ сгенерировал вызовы LAPACK. LAPACK является библиотекой программного обеспечения в числовой линейной алгебре. MATLAB Coder использует интерфейс C LAPACKE для 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'); 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, которой вы хотите пользоваться.
Запишите функцию 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 массив типа double.
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));