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

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

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

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

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

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

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

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

Например, см. Основной пример выравнивания данных замены кода и раздел «Выравнивание данных для реализации функции» на странице примера Оптимизации сгенерированного кода путем разработки и использования библиотек замены кода - Simulink ®.

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

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

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

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

The AlignmentBoundary свойство (или Alignment value параметр) задает контур выравнивания для данных, переданных в аргумент функции, в количестве байтов. The 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 объект записи реестра.

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

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

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

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

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

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))) сгенерирован для выравнивания переменных функции.

Похожие темы