Ускорьте Матричные операции в коде, сгенерированном от блока MATLAB Function

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

Генератор кода пользуется библиотекой BLAS, которую вы задаете. Задайте библиотеку BLAS, которая оптимизирована для вашей среды выполнения.

Задайте библиотеку BLAS

Чтобы произвести вызовы BLAS в сгенерированном коде, у вас должен быть доступ к классу коллбэка BLAS. Класс коллбэка BLAS задает библиотеку BLAS, заголовочный файл CBLAS, определенные типы данных C конкретное использование интерфейса CBLAS и компилятор и опции компоновщика для процесса сборки.

Чтобы указать, что вы хотите сгенерировать вызовы BLAS и пользоваться определенной библиотекой BLAS, задайте имя класса коллбэка BLAS. В диалоговом окне Configuration Parameters, набор Custom BLAS library callback к имени класса коллбэка.

Запишите класс коллбэка BLAS

Чтобы сгенерировать вызовы определенной библиотеки BLAS в сгенерированном коде, запишите класс коллбэка BLAS. Совместно используйте класс коллбэка с другими, которые хотят пользоваться этой библиотекой BLAS для вызовов BLAS в автономном коде.

Класс коллбэка должен вывести из абстрактного класса coder.BLASCallback. Этим примером является реализация класса коллбэка mklcallback для интеграции с библиотекой Intel MKL BLAS по платформе Windows®.

classdef mklcallback < coder.BLASCallback
    methods (Static)
        function updateBuildInfo(buildInfo, ~)
            libPath = fullfile(pwd,'mkl','WIN','lib','intel64');
            libPriority = '';
            libPreCompiled = true;
            libLinkOnly = true;
            libs = {'mkl_intel_ilp64.lib' 'mkl_intel_thread.lib' 'mkl_core.lib'};
            buildInfo.addLinkObjects(libs, libPath, libPriority, libPreCompiled, ...
                                  libLinkOnly);
            buildInfo.addLinkObjects('libiomp5md.lib',fullfile(matlabroot,'bin', ...
                             'win64'), libPriority, libPreCompiled, libLinkOnly);
            buildInfo.addIncludePaths(fullfile(pwd,'mkl','WIN','include'));
            buildInfo.addDefines('-DMKL_ILP64');
        end
        function headerName = getHeaderFilename()
            headerName = 'mkl_cblas.h';
        end
        function intTypeName = getBLASIntTypeName()
            intTypeName = 'MKL_INT';
        end
    end
end

Необходимо обеспечить getHeaderFilename, getBLASIntTypeName, и updateBuildInfo методы. getHeaderFilename метод возвращает имя заголовочного файла CBLAS. Если вы пользуетесь различной библиотекой BLAS, заменяете mkl_cblas.h с именем вашего заголовочного файла CBLAS. getBLASIntTypeName метод возвращает имя целочисленного типа данных, который использует ваш интерфейс CBLAS. Если вы пользуетесь различной библиотекой BLAS, заменяете MKL_INT с именем целочисленного типа данных, характерного для вашего интерфейса CBLAS. updateBuildInfo метод предоставляет информацию, запрошенную для процесса сборки, чтобы соединиться с библиотекой BLAS. Используйте код, который похож на код в классе коллбэка в качестве примера, чтобы задать местоположение заголовочного файла, имя полного пути библиотеки BLAS, и опции компоновщика и компилятор. Если вы пользуетесь библиотекой Intel MKL BLAS, используйте советника по вопросам линии ссылки, чтобы видеть, каким библиотекам и параметрам компилятора рекомендуют для вашего варианта использования.

Существует три других метода, которые уже реализованы в coder.BLASCallback. Этими методами является getBLASDoubleComplexTypeName, getBLASSingleComplexTypeName, и useEnumNameRatherThanTypedef. По умолчанию ваш класс коллбэка наследовал эти реализации от coder.BLASCallback. В определенных ситуациях необходимо заменить эти методы с собственными определениями, когда вы задаете свой класс коллбэка.

getBLASDoubleComplexTypeName метод возвращает тип, используемый для комплексных переменных с двойной точностью в сгенерированном коде. Если ваша библиотека BLAS берет тип кроме double* и void* для аргументов комплексного массива с двойной точностью включайте этот метод в свое определение класса коллбэка.

function doubleComplexTypeName = getBLASDoubleComplexTypeName()
doubleComplexTypeName = 'my_double_complex_type';
end

Замените my_double_complex_type с типом, который ваша библиотека BLAS берет для аргументов комплексного массива с двойной точностью.

getBLASSingleComplexTypeName метод возвращает тип, используемый для комплексных переменных с одинарной точностью в сгенерированном коде. Если ваша библиотека BLAS берет тип кроме float* и void* для аргументов комплексного массива с одинарной точностью включайте этот метод в свое определение класса коллбэка.

function singleComplexTypeName = getBLASSingleComplexTypeName()
doubleComplexTypeName = 'my_single_complex_type';
end

Замените my_single_complex_type с типом, который ваша библиотека BLAS берет для аргументов комплексного массива с одинарной точностью.

useEnumNameRatherThanTypedef метод возвращает false по умолчанию. Если типы для перечислений в вашей библиотеке BLAS включают enum ключевое слово, переопределите этот метод, чтобы возвратить true в вашем определении класса коллбэка.

function p = useEnumNameRatherThanTypedef()
p = true;
end

Выборка из сгенерированного исходного кода C, который включает enum ключевое слово:

enum CBLAS_SIDE t;
enum CBLAS_UPLO b_t;
double temp;
enum CBLAS_TRANSPOSE c_t;
enum CBLAS_DIAG d_t;

Сгенерируйте вызовы BLAS путем определения класса коллбэка BLAS

В этом примере показано, как сгенерировать код, который вызывает функции BLAS в определенной библиотеке BLAS. Класс коллбэка BLAS useMyBLAS задает библиотеку BLAS, которой вы хотите пользоваться в этом примере.

  1. Создайте модель Simulink®.

  2. Добавьте блок MATLAB Function в модель.

  3. В блоке MATLAB Function добавьте код, который вызывает функцию для основной операции над матрицей. Например, добавьте функциональный myMultiply это умножает две матрицы A и B.

    function C = myMultiply(A,B) %#codegen
    C = A*B;
    end

  4. Добавьте два блока Constant слева от блока MATLAB Function. Установите их значения к zeros(1000).

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

  6. Соедините блоки.

  7. В диалоговом окне Configuration Parameters, набор Custom BLAS library callback к имени класса коллбэка useMyBLAS.

    Класс коллбэка должен быть на пути MATLAB®.

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

    Если A и B являются достаточно большими, генератор кода производит призыв BLAS к функции умножения матриц.

Найдите библиотеку BLAS в среде выполнения

Библиотека BLAS должна быть доступной в вашей среде выполнения. Если ваша библиотека BLAS совместно используется, используйте переменные окружения или опции компоновщика, чтобы задать местоположение библиотеки BLAS.

  • На платформе Windows измените переменную окружения PATH.

  • На платформе Linux® измените переменную окружения LD_LIBRARY_PATH или используйте rpath опция компоновщика.

  • На macOS платформе измените переменную окружения DYLD_LIBRARY_PATH или используйте rpath опция компоновщика.

Задавать rpath опция компоновщика, используйте информацию о сборке addLinkFlags метод в updateBuildInfo метод вашего класса коллбэка BLAS. Например, для компилятора GCC:

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

Указания и ограничения по применению для библиотеки OpenBLAS

Если вы генерируете код, который включает вызовы библиотечных функций OpenBLAS, следуйте этим инструкциям и ограничениям:

  • Если вы генерируете Код С++, который включает вызовы библиотечных функций OpenBLAS, компилируя его с -pedantic опция производит предупреждения. Отключить -pedantic параметр компилятора, включайте эти линии в updateBuildInfo метод:

    if ctx.getTargetLang() == 'C++'
        buildInfo.addCompileFlags('-Wno-pedantic');
    end
  • OpenBLAS не поддерживает стандарт C89/C90.

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

Похожие темы

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