exponenta event banner

Согласование данных для замены кода

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

Согласование данных замены кода

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

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

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

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

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

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

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

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

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

  • При определении функции замены с помощью инструмента «Замена кода» на вкладке «Информация о сопоставлении» в разделе «Свойства аргумента» для функции замены введите значение параметра «Значение трассы».

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);

На этом рисунке приведена спецификация эквивалентной границы трассы в диалоговом окне «Инструмент замены кода».

Примечание

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

Предоставление спецификаций выравнивания данных для компиляторов

Для поддержки выравнивания данных в сгенерированном коде опишите возможности выравнивания данных и синтаксис компиляторов в регистрации библиотеки замены кода. Укажите одну или несколько спецификаций выравнивания для каждого компилятора в записи реестра библиотеки.

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

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

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

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

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

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

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

AlignmentSpecification Собственность

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

Описание

AlignmentType

Тип трассы

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

  • 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

Положение выравнивания

Предопределенная перечисляемая строка, указывающая позицию, в которую необходимо поместить директиву выравнивания компилятора для типа выравнивания 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

Синтаксис выравнивания

Указывает строку директивы выравнивания, поддерживаемую компилятором. Строка регистрируется в качестве синтаксического шаблона, содержащего местозаполнители. Поддерживаются следующие местозаполнители:

  • %n - заменяется границей выравнивания для аргумента функции замены.

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

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

SupportedLanguages

Поддерживаемые языки

Массив ячеек, указывающий языки, к которым применяется данная спецификация выравнивания, среди 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))) генерируется для выравнивания переменных функции.

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