exponenta event banner

Ускорение линейной алгебры в коде, сгенерированном из функционального блока MATLAB

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

Генератор кода использует указанную библиотеку 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. В диалоговом окне Configuration Parameters установите для параметра Custom LAPACK library callback имя класса обратного вызова, например: useMyLAPACK.

Запись класса обратного вызова 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. Создание модели Simulink ®.

  2. Добавьте в модель функциональный блок MATLAB.

  3. В блоке MATLAB Function добавьте код, вызывающий функцию линейной алгебры. Например, добавьте функцию mysvd который вызывает функцию MATLAB ®svd.

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

  4. Добавьте блок константы слева от блока функции MATLAB. Задайте значение zeros(500).

  5. Добавьте блок Outport справа от блока MATLAB Function.

  6. Подключите блоки.

  7. Установите для параметра Configuration Parameters > Code Generation > Advanced parameters > Custom LAPACK library callback значение useMyLAPACK.

    Класс обратного вызова должен находиться в пути MATLAB.

  8. Создайте модель.

Если вход в mysvd достаточно большой, генератор кода производит вызов 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));

См. также

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

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