Ускорьте линейную алгебру в сгенерированном автономном коде при помощи вызовов 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 набора к имени класса обратного вызова.

Запишите класс обратного вызова 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));

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

Похожие темы

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

Была ли эта тема полезной?