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

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

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

Похожие темы

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