Ускорьте линейную алгебру в сгенерированном автономном коде при помощи вызовов LAPACK

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

  • В командной строке, набор свойство объекта настройки кода CustomLAPACKCallback к имени класса коллбэка.

  • В приложении MATLAB Coder, набор Custom LAPACK library callback к имени класса коллбэка.

Запишите класс коллбэка 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 в определенной библиотеке LAPACK. В данном примере примите, что класс коллбэка LAPACK, useMyLAPACK задает библиотеку LAPACK, которой вы хотите пользоваться.

  1. Запишите функцию MATLAB, которая вызывает функцию линейной алгебры. Например, запишите функциональный mysvd, который вызывает функцию MATLAB svd.

    function s = mysvd(A)
        %#codegen
        s = svd(A);
    end

  2. Задайте объект настройки кода для статической библиотеки, динамически подключаемой библиотеки или исполняемой программы. Например, задайте объект настройки для динамически подключаемой библиотеки на платформе Windows®.

    cfg = coder.config('dll');

  3. Задайте класс коллбэка LAPACK useMyLAPACK.

    cfg.CustomLAPACKCallback = 'useMyLAPACK';

    Класс коллбэка должен быть на пути MATLAB.

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

Смотрите также

Похожие темы

Внешние веб-сайты