exponenta event banner

Операция умножения матрицы на замену кода BLAS ANSI/ISO C

Можно разработать библиотеку замены кода для операций умножения матрицы/матрицы с плавающей запятой и матрицы/вектора с помощью функций умножения. sgemm определяется в библиотеке MathWorks C BLAS. Используйте библиотеку C BLAS стороннего производителя для замены и измените требования сборки в этом примере, чтобы указать на библиотеку. Для разработки библиотеки замены кода используйте интерактивный или программный подход. Дополнительные сведения см. в разделе Разработка библиотеки замены кода.

Интерактивная разработка библиотеки замены кода

  1. Откройте инструмент замены кода (crtool) в командной строке MATLAB с помощью следующей команды:

    >>crtool
  2. Создайте таблицу.

    1. В контекстном меню crtool выберите «Файл» > «Новая таблица».

    2. На правой панели присвойте таблице имя crl_table_cblas. Нажмите кнопку «Применить».

  3. Создайте запись. В контекстном меню crtool выберите File > New entry > CBlas Operation (Atlas).

  4. Создание параметров записи. В раскрывающемся списке «Функция» выберите Multiply.

  5. Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. В подразделе «Концептуальная функция» crtool укажите возвращаемый аргумент. y1и входной аргумент, u1 и u2 с типом данных Single и типом аргумента матрицы.

  6. Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Для этого примера, чтобы указать, что аргументы реализации имеют тот же порядок и те же свойства, что и концептуальные аргументы, установите флажок Сделать концептуальный и аргумент реализации типами одного и того же типа. Установите уровень BLAS на 3(Vector).

    Укажите имя для функции замены в разделе Прототип функции.

  7. Укажите сведения о построении. Щелкните вкладку Сведения о построении, чтобы открыть панель требований к построению. Укажите файлы (источник, заголовок, объект), необходимые генератору кода для замены кода. В этом примере нет необходимости указывать информацию о построении.

  8. Проверьте и сохраните таблицу. На вкладке Информация о сопоставлении щелкните Проверить запись. В контекстном меню crtool выберите «Файл» > «Сохранить таблицу» > «Сохранить».

  9. Зарегистрируйте библиотеку замены кода. При регистрации создается библиотека, состоящая из указанных таблиц. Выберите «Файл» > «Создать файл регистрации». В диалоговом окне Создать файл регистрации заполните следующие поля:

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс MATLAB с помощью команды:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.

Программная разработка библиотеки замены кода

  1. Откройте программный интерфейс в меню MATLAB, выбрав Создать > Функция.

  2. Создайте таблицу.

    1. Создайте функцию для вызова таблицы библиотеки замены кода. Функция не должна иметь аргументов и возвращать объект таблицы.

    2. Создание объекта таблицы путем вызова RTW.TflTable.

    function hTable = crl_table_cblas
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав функцию записи. RTW.TflCBlasEntryGenerator.

    function hTable = crl_table_cblas
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    %%%%%%%%%%%% Define library path Cblas library file%%%%%%%%%%%%%%%%%%
    
    LibPath = fullfile('<Specify the path of your cblas library>');
    
    if ispc
        libExt = 'lib';
    elseif ismac
        libExt = 'dylib';
    else
        libExt = 'so';
    end
    
    
    % Create table entry for dgemm32
    hEntry = RTW.TflCBlasEntryGenerator;
  4. Создание параметров записи. Поскольку эти примеры заменяют функцию, создайте параметры записи, вызвав функцию setTflCFunctionEntryParameters.

    function hTable = crl_table_cblas
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    %%%%%%%%%%%% Define library path Cblas library file%%%%%%%%%%%%%%%%%%
    
    LibPath = fullfile('<Specify the path of your cblas library>');
    
    if ispc
        libExt = 'lib';
    elseif ismac
        libExt = 'dylib';
    else
        libExt = 'so';
    end
    
    
    % Create table entry for dgemm32
    hEntry = RTW.TflCBlasEntryGenerator;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters( ...
        'Key', 'RTW_OP_MUL', ...
        'Priority', 100, ...
        'ImplementationName', 'cblas_sgemm', ...
        'ImplementationSourceFile', 'ccblas.c', ...
        'ImplementationHeaderFile', 'ccblas.h', ...
        'AdditionalIncludePaths',   {LibPath}, ...
        'AdditionalLinkObjs',       {['libcblas' libExt]}, ...
        'AdditionalLinkFlags',        {'-lgfortran'},...
        'SideEffects', true);
  5. Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. Чтобы явно указать свойства аргумента, вызовите функцию createAndAddConceptualArg. Чтобы указать аргумент матрицы в вызове функции, используйте класс аргументов RTW.TflArgMatrix и укажите базовый тип и размеры, для которых допустим аргумент. Этот тип записи таблицы поддерживает диапазон измерений, заданных в формате [Dim1Min Dim2Min ... DimNMin; Dim1Max Dim2Max ... DimNMax]. Например, [2 2; inf inf] означает двумерную матрицу размером 2x2 или больше.

    function hTable = crl_table_cblas
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    %%%%%%%%%%%% Define library path Cblas library file%%%%%%%%%%%%%%%%%%
    
    LibPath = fullfile('<Specify the path of your cblas library>');
    
    if ispc
        libExt = 'lib';
    elseif ismac
        libExt = 'dylib';
    else
        libExt = 'so';
    end
    
    
    % Create table entry for dgemm32
    hEntry = RTW.TflCBlasEntryGenerator;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters( ...
        'Key', 'RTW_OP_MUL', ...
        'Priority', 100, ...
        'ImplementationName', 'cblas_sgemm', ...
        'ImplementationSourceFile', 'ccblas.c', ...
        'ImplementationHeaderFile', 'ccblas.h', ...
        'AdditionalIncludePaths',   {LibPath}, ...
        'AdditionalLinkObjs',       {['libcblas' libExt]}, ...
        'AdditionalLinkFlags',      {'-lgfortran'},...
        'SideEffects', true);
    
    %% Create the conceptual representation
    arg = RTW.TflArgMatrix('y1', 'RTW_IO_OUTPUT',  'single');
    arg.DimRange = [2 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u1', 'RTW_IO_INPUT',  'single');
    arg.DimRange = [2 1; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT',  'single');
    arg.DimRange = [1 2; Inf Inf];
    hEnt.addConceptualArg(arg);
  6. Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию getTflArgFromString. В примере кода настраиваются специальные аргументы реализации, необходимые для dgemm и dgemv замены функций. Методы удобства setReturn и addArgument укажите, является ли аргумент возвращаемым значением или аргументом, и добавьте аргумент к массиву аргументов реализации элемента. Добавление полной записи в таблицу путем вызова функции addEntry.

    function hTable = crl_table_cblas
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    %%%%%%%%%%%% Define library path Cblas library file%%%%%%%%%%%%%%%%%%
    
    LibPath = fullfile('<Specify the path of your cblas library>');
    
    if ispc
        libExt = 'lib';
    elseif ismac
        libExt = 'dylib';
    else
        libExt = 'so';
    end
    
    
    % Create table entry for dgemm32
    hEntry = RTW.TflCBlasEntryGenerator;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters( ...
        'Key', 'RTW_OP_MUL', ...
        'Priority', 100, ...
        'ImplementationName', 'cblas_sgemm', ...
        'ImplementationSourceFile', 'ccblas.c', ...
        'ImplementationHeaderFile', 'ccblas.h', ...
        'AdditionalIncludePaths',   {LibPath}, ...
        'AdditionalLinkObjs',       {['libcblas' libExt]}, ...
        'AdditionalLinkFlags',      {'-lgfortran'},...
        'SideEffects', true);
    
    %% Create the conceptual representation
    
    arg = RTW.TflArgMatrix('y1', 'RTW_IO_OUTPUT',  'single');
    arg.DimRange = [2 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u1', 'RTW_IO_INPUT',  'single');
    arg.DimRange = [2 1; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT',  'single');
    arg.DimRange = [1 2; Inf Inf];
    hEnt.addConceptualArg(arg);
    
    %% Create the Implementation Representation
    % Using RTW.TflCBlasEntryGenerator for sgemm requires the following
    % implementation signature:
    %
    % void no_name( const integer ORDER, const integer TRANSA, const integer TRANSB, 
    % const integer M, const integer N, const integer K, const double ALPHA, 
    % const double* u1, const integer LDA, const double* u2, const integer LDB, 
    % const double BETA, double* y1, const integer LDC );
    %
    % When a match occurs, the code generator computes the
    % values for M, N, K, LDA, LDB, and LDC and inserts them into the
    % generated code. TRANSA and TRANSB are set to 'N'.
    
    % Specify replacement function signature
    arg = hEntry.getTflArgFromString('y2','void');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.setReturn(arg); 
    
    arg = hEntry.getTflArgFromString('ORDER','integer',102.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('TRANSA','integer',111.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('TRANSB','integer',111.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('M','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('N','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('K','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('ALPHA','double',1.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('u1','single*');
    arg.Type.BaseType.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('LDA','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('u2','single*');
    arg.Type.BaseType.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('LDB','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('BETA','double',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('y1','single*');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('LDC','integer',0.000000000000000);
    arg.Type.ReadOnly = true;
    hEntry.Implementation.addArgument(arg);
    
    
    %% Add the entry to the table
    addEntry(hTable, hEntry);
  7. Укажите сведения о построении. В параметрах ввода укажите файлы (заголовок, источник, объект), необходимые генератору кода для замены кода. Для этого примера информация о построении не требуется.

  8. Проверьте и сохраните файл настройки. В меню MATLAB сохраните этот файл настройки, выбрав «Файл» > «Сохранить». В командной строке проверьте таблицу библиотеки замены кода, вызвав ее:

    >> hTable = crl_table_cblas
  9. Зарегистрируйте библиотеку замены кода. Регистрация создает библиотеку замены кода, определяя имя библиотеки, таблицы замены кода и другую информацию. Создайте файл регистрации со следующими спецификациями:

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for matrix multiplication for Mathworks CBlas code’;
    this(1).TableList = {'crl_table_cblas.m'}; % table created in this example
    this(1).TargetHWDeviceType = {'*'};
    this(1).Description = 'Example code replacement library';
    
    end
    

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс MATLAB с помощью команды:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.

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