exponenta event banner

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

Чтобы повысить скорость выполнения кода, генерируемого для определенных функций линейной алгебры в автономном коде (библиотеке или исполняемой программе), укажите, что необходимо, чтобы MATLAB ® Coder™ генерировал вызовы LAPACK. LAPACK - библиотека программного обеспечения для числовой линейной алгебры. Кодер MATLAB использует интерфейс LAPACKE C для LAPACK. Если указано, что требуется генерировать вызовы LAPACK, а входные массивы для функций линейной алгебры соответствуют определенным критериям, генератор кода создает вызовы LAPACK. В противном случае генератор кода создает код для функций линейной алгебры.

Для вызовов LAPACK в автономном коде кодер MATLAB использует указанную библиотеку 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.

    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 linker, можно использовать информацию о построении addLinkFlags метод в updateBuildInfo метод вашего coder.LAPACKCallback класс. Например, для компилятора GCC:

buildInfo.addLinkFlags(sprintf('-Wl,-rpath,"%s"',libPath));

См. также

Связанные темы

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