Выравнивание данных для замены кода

Заменяющие библиотеки кода могут выровняться, объекты данных передали в заменяющую функцию заданному контуру.

Заменяющее выравнивание данных кода

Можно использовать в своих интересах реализации функции, которые требуют, чтобы выровненные данные оптимизировали производительность приложения. Сконфигурировать выравнивание данных для реализации функции:

  1. Задайте требования выравнивания данных в заменяющей записи кода. Задайте выравнивание отдельно для каждого аргумента функции реализации или коллективно для всех аргументов функции. Смотрите Задают Требования Выравнивания Данных для Аргументов функции.

  2. Задайте возможности выравнивания данных и синтаксис для одного или нескольких компиляторов. Включайте технические требования выравнивания в регистрационную запись библиотеки в rtwTargetInfo.m файл. Смотрите Предоставляют Технические требования Выравнивания Данных для Компиляторов.

  3. Укажите библиотеку, содержащую запись таблицы и объект спецификации выравнивания.

  4. Сконфигурируйте генератор кода, чтобы пользоваться заменяющей библиотекой кода и сгенерировать код. Наблюдайте результаты.

Для примеров смотрите Основной Пример Заменяющего Выравнивания Данных Кода и раздел “Data Alignment for Function Implementations” Оптимизировать Сгенерированного кода Путем Разработки и пользования Заменяющими Библиотеками Кода - страница Simulink® в качестве примера.

Задайте требования выравнивания данных для аргументов функции

Задавать требование выравнивания данных для аргумента в заменяющей записи кода:

  • Если вы задаете заменяющую функцию в заменяющем табличном регистрационном файле кода, создаете объект дескриптора аргумента (RTW.ArgumentDescriptor). Используйте его AlignmentBoundary свойство задать необходимый контур выравнивания и присвоить объект аргументу Descriptor свойство.

  • Если вы задаете заменяющую функцию, использование Code Replacement Tool, на вкладке Mapping Information, в разделе Argument properties для заменяющей функции, вводит значение для параметра Alignment value.

AlignmentBoundary свойство (или параметр Alignment value) указывает, что контур выравнивания для данных передал аргументу функции в количестве байтов. AlignmentBoundary свойство допустимо только для адресуемых объектов, включая аргументы указателя и матрицу. Это не применимо для аргументов значения. Допустимые значения:

  • -1 (значение по умолчанию) — Если данными является Simulink.Bus, Simulink.Signal, или Simulink.Parameter возразите, указывает, что генератор кода определяет оптимальное выравнивание на основе использования. В противном случае, указывает, что нет требования выравнивания для этого аргумента.

  • Положительное целое число, которое является степенью 2, не превышая 128 — Задает количество байтов в контуре. Стартовый адрес памяти для данных, выделенных для аргумента функции, является кратным заданному значению. Если вы задаете контур выравнивания, который меньше естественного выравнивания типа данных аргумента, директива выравнивания испускается в сгенерированном коде. Однако целевой компилятор игнорирует директиву.

Следующий код задает AlignmentBoundary для аргумента как 16 байтов.

hLib = RTW.TflTable;
entry = RTW.TflCOperationEntry;
arg = getTflArgFromString(hLib, 'u1','single*');
desc = RTW.ArgumentDescriptor;
desc.AlignmentBoundary = 16;
arg.Descriptor = desc;
entry.Implementation.addArgument(arg);

Эквивалентная спецификация контура выравнивания в диалоговом окне Code Replacement Tool находится в этом рисунке.

Примечание

Если ваша модель импортирует Simulink.Bus, Simulink.Parameter, или Simulink.Signal объекты, задайте контур выравнивания в свойствах объектов, с помощью свойства Alignment. Для получения дополнительной информации смотрите Simulink.Bus, Simulink.Parameter, и Simulink.Signal.

Предоставьте технические требования выравнивания данных для компиляторов

Чтобы поддержать выравнивание данных в сгенерированном коде, опишите возможности выравнивания данных и синтаксис для ваших компиляторов в заменяющей регистрации библиотеки кода. Предоставьте одни или несколько технических требований выравнивания для каждого компилятора в ключе реестра библиотеки.

Описать возможности выравнивания данных и синтаксис для компилятора:

  • Если вы задаете заменяющую регистрационную запись библиотеки кода в rtwTargetInfo.m файл настройки, добавляет один или несколько AlignmentSpecification объекты к RTW.DataAlignment объект. Присоедините RTW.DataAlignment возразите против TargetCharacteristics объект ключа реестра.

    RTW.DataAlignment объект также имеет свойство DefaultMallocAlignment, который задает контур выравнивания по умолчанию в байтах, что компилятор использует в динамически выделенной памяти. Если генератор кода использует динамическое выделение памяти в объекте данных, вовлеченном в замену кода, это значение определяет, удовлетворяет ли память требованию выравнивания замены. В противном случае генератор кода не использует замену. Значение по умолчанию для DefaultMallocAlignment -1, указание, что контур выравнивания по умолчанию, используемый в динамически выделенной памяти, неизвестен. В этом случае генератор кода использует естественное выравнивание типа данных, чтобы определить, позволить ли замену.

    Кроме того, можно задать контур выравнивания для составных типов при помощи addComplexTypeAlignment функция.

  • Если вы генерируете функцию файла настройки использование Заменяющего Инструмента Кода, заполняете следующие поля для каждого компилятора.

    Щелкните плюс (+) символ, чтобы добавить дополнительные технические требования компилятора.

Для каждой спецификации выравнивания данных предоставьте следующую информацию.

AlignmentSpecification Свойство

Параметр диалогового окна

Описание

AlignmentType

Alignment type

Массив ячеек предопределенных перечислимых строк, задавая, который типы выравнивания эта спецификация поддержки.

  • DATA_ALIGNMENT_LOCAL_VAR — Локальные переменные.

  • DATA_ALIGNMENT_GLOBAL_VAR Глобальные переменные.

  • DATA_ALIGNMENT_STRUCT_FIELD — Отдельные поля структуры.

  • DATA_ALIGNMENT_WHOLE_STRUCT — Целая структура, с дополнением (отдельное полевое выравнивание структуры, если задано, одобрено и более приоритетно по сравнению с целым выравниванием структуры).

Каждая спецификация выравнивания должна задать, по крайней мере, DATA_ALIGNMENT_GLOBAL_VAR и DATA_ALIGNMENT_STRUCT_FIELD.

AlignmentPosition

Alignment position

Предопределенная перечисленная строка, задающая положение, в которое необходимо поместить директиву выравнивания компилятора для выравнивания, вводит DATA_ALIGNMENT_WHOLE_STRUCT:

  • DATA_ALIGNMENT_PREDIRECTIVE — Директива выравнивания испускается перед struct st_tag{…}, как часть оператора определения типа (например, MSVC).

  • DATA_ALIGNMENT_POSTDIRECTIVE — Директива выравнивания испускается после struct st_tag{…}, как часть оператора определения типа (например, gcc).

  • DATA_ALIGNMENT_PRECEDING_STATEMENT — Директива выравнивания испускается как автономный оператор, сразу предшествующий определению типа структуры. Точка с запятой (;) должен отключить зарегистрированный синтаксис выравнивания.

  • DATA_ALIGNMENT_FOLLOWING_STATEMENT — Директива выравнивания испускается как автономный оператор сразу после определения типа структуры. Точка с запятой (;) должен отключить зарегистрированный синтаксис выравнивания.

Поскольку выравнивание вводит кроме DATA_ALIGNMENT_WHOLE_STRUCT, генерация кода использует положение выравнивания DATA_ALIGNMENT_PREDIRECTIVE.

AlignmentSyntaxTemplate

Alignment syntax

Задает направляющую строку выравнивания, которую поддерживает компилятор. Строка указана как шаблон синтаксиса, который имеет заполнителей в ней. Эти заполнители поддерживаются:

  • %n — Замененный контуром выравнивания для заменяющего аргумента функции.

  • %s — Замененный выровненным символом, обычно идентификатор переменной.

Например, для gcc компилятора, можно задать __attribute__((aligned(%n))), или для компилятора MSVC, __declspec(align(%n)).

SupportedLanguages

Supported languages

Массив ячеек, задающий языки, к которым эта спецификация выравнивания применяется среди c и c++. Иногда синтаксис выравнивания и положение отличаются между языками для компилятора.

Вот спецификация выравнивания данных для компилятора GCC:

da = RTW.DataAlignment;

as = RTW.AlignmentSpecification;
as.AlignmentType = {'DATA_ALIGNMENT_LOCAL_VAR', ...
                    'DATA_ALIGNMENT_STRUCT_FIELD', ...
                    'DATA_ALIGNMENT_GLOBAL_VAR'};
as.AlignmentSyntaxTemplate = '__attribute__((aligned(%n)))';
as.AlignmentPosition = 'DATA_ALIGNMENT_PREDIRECTIVE';
as.SupportedLanguages = {'c', 'c++'};
da.addAlignmentSpecification(as);

tc = RTW.TargetCharacteristics;
tc.DataAlignment = da;

Вот соответствующая спецификация в диалоговом окне Generate customization Заменяющего Инструмента Кода.

Основной пример заменяющего выравнивания данных кода

Простой пример полного рабочего процесса для выравнивания данных, заданного для замены кода:

  1. Создайте и сохраните следующий заменяющий табличный файл определения кода, crl_table_mmul_4x4_single_align.m. Эта таблица задает заменяющую запись для * (умножение) оператор, single тип данных и входные размерности [4,4]. Запись также задает контур выравнивания данных 16 байтов для каждого заменяющего аргумента функции. Запись выражает требование, чтобы стартовый адрес памяти для данных, выделенных для аргументов функции во время генерации кода, был кратным 16.

    function hLib = crl_table_mmul_4x4_single_align
    %CRL_TABLE_MMUL_4x4_SINGLE_ALIGN - Describe matrix operator entry with data alignment
    
    hLib = RTW.TflTable;
    entry = RTW.TflCOperationEntry;
    setTflCOperationEntryParameters(entry, ...
        'Key',                   'RTW_OP_MUL', ...
        'Priority',              90, ...
        'ImplementationName',    'matrix_mul_4x4_s');
    
    % conceptual arguments
    createAndAddConceptualArg(entry, 'RTW.TflArgMatrix',...
                                    'Name',         'y1', ...
                                    'IOType',       'RTW_IO_OUTPUT', ...
                                    'BaseType',     'single', ...
                                    'DimRange',     [4 4]);
    
    createAndAddConceptualArg(entry, 'RTW.TflArgMatrix',...
                                    'Name',         'u1', ...
                                    'BaseType',     'single', ...
                                    'DimRange',     [4 4]);
    
    createAndAddConceptualArg(entry, 'RTW.TflArgMatrix',...
                                    'Name',         'u2', ...
                                    'BaseType',     'single', ...
                                    'DimRange',     [4 4]);
    
    % implementation arguments
    arg = getTflArgFromString(hLib, 'y2', 'void');
    arg.IOType = 'RTW_IO_OUTPUT';
    entry.Implementation.setReturn(arg);
    
    arg = getTflArgFromString(hLib, 'y1','single*');
    arg.IOType = 'RTW_IO_OUTPUT';
    desc = RTW.ArgumentDescriptor;
    desc.AlignmentBoundary = 16;
    arg.Descriptor = desc;
    entry.Implementation.addArgument(arg);
    
    arg = getTflArgFromString(hLib, 'u1','single*');
    desc = RTW.ArgumentDescriptor;
    desc.AlignmentBoundary = 16;
    arg.Descriptor = desc;
    entry.Implementation.addArgument(arg);
    
    arg = getTflArgFromString(hLib, 'u2','single*');
    desc = RTW.ArgumentDescriptor;
    desc.AlignmentBoundary = 16;
    arg.Descriptor = desc;
    entry.Implementation.addArgument(arg);
    
    hLib.addEntry(entry);
  2. Создайте и сохраните следующий регистрационный файл, rtwTargetInfo.m. Если вы хотите скомпилировать код, сгенерированный в этом примере, сначала измените AlignmentSyntaxTemplate свойство для компилятора, который вы используете. Например, для компилятора MSVC, замените спецификацию шаблона gcc __attribute__((aligned(%n))) с __declspec(align(%n)).

    function rtwTargetInfo(cm)
    % rtwTargetInfo function to register a code replacement library (CRL)
    % for use with  code generation
    
      % Register the CRL defined in local function locCrlRegFcn
      cm.registerTargetInfo(@locCrlRegFcn);
    
    end % End of RTWTARGETINFO
    
    % Local function to define a CRL containing crl_table_mmul_4x4_single_align
    function thisCrl = locCrlRegFcn
    
      % create an alignment specification object, assume gcc
      as = RTW.AlignmentSpecification;
      as.AlignmentType = {'DATA_ALIGNMENT_LOCAL_VAR', ...
                          'DATA_ALIGNMENT_GLOBAL_VAR', ...
                          'DATA_ALIGNMENT_STRUCT_FIELD'};
      as.AlignmentSyntaxTemplate = '__attribute__((aligned(%n)))';
      as.SupportedLanguages={'c', 'c++'};
    
      % add the alignment specification object
      da = RTW.DataAlignment;
      da.addAlignmentSpecification(as);
    
      % add the data alignment object to target characteristics
      tc = RTW.TargetCharacteristics;
      tc.DataAlignment = da;
    
      % Instantiate a CRL registry entry
      thisCrl = RTW.TflRegistry;
    
      % Define the CRL properties
      thisCrl.Name = 'Data Alignment Example';
      thisCrl.Description = 'Example of replacement with data alignment';
      thisCrl.TableList = {'crl_table_mmul_4x4_single_align'};
        thisCrl.TargetCharacteristics = tc;
    
    end % End of LOCCRLREGFCN
  3. Чтобы указать вашу библиотеку с генератором кода, не имея необходимость перезапускать MATLAB®, введите эту команду:

    RTW.TargetRegistry.getInstance('reset');
  4. Сконфигурируйте генератор кода, чтобы пользоваться вашей заменяющей библиотекой кода.

  5. Сгенерируйте код и отчет генерации кода.

  6. Рассмотрите замены кода. Например, проверяйте, заменяется ли операция умножения matrix_mul_4x4_s вызов функции. В mmalign.h, проверяйте ли gcc директива выравнивания __attribute__((aligned(16))) сгенерирован, чтобы выровнять функциональные переменные.

Похожие темы