Ускорьте линейную алгебру в коде, сгенерированном от блока MATLAB Function

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

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

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

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

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

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

Похожие темы

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