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

Можно сгенерировать код, который имеет замену кода, активированную несколькими библиотеками замены кода. Можно выбрать несколько библиотек замены кода в унифицированном рабочем процессе, чтобы сгенерированный код содержал оптимизации от различных библиотек замены кода, таких как AUTOSAR 4.0 и Intel SSE. Можно также выбрать собственные пользовательские библиотеки замены кода наряду с библиотеками, включенными в Embedded Coder, чтобы дополнительно оптимизировать сгенерированный код. Можно выбрать и использовать комбинацию библиотек и достичь необходимых функциональных возможностей, и не нужно создавать отдельные библиотеки. В образцах, когда существует несколько пользовательских библиотек замещения кода, и вам нужны функциональные возможности от всех из них, индивидуально выбирайте библиотеки.

Пример модели

В этом примере показано, как заменить сгенерированный код для модели, содержащей блок Add и блок Abs, с помощью нескольких библиотек замены кода. Вы заменяете блок Abs с помощью индивидуальной настройки замены кода, которая заменяет обычную fabs функция с пользовательской реализацией CRL_abs_d от ScalarFcn библиотека. Блок Add имеет входы размера [50 50]. Циклы в сгенерированном коде векторизированы с возможностями SIMD, поддерживаемыми Intel AVX библиотека.

Откройте модель mMultiLibrary_abs который имеет блок Add и блок Abs.

model = 'mMultiLibrary_abs';
open_system(model);

copyfile multipleFnRtwTargetInfo.txt rtwTargetInfo.m

Файлы индивидуальной настройки MATLAB hcrl_make_abs и hcrl_sum_float уже выполнены. Запустите функцию sl_refresh_customizations, чтобы зарегистрировать библиотеку ScalarFcn.

sl_refresh_customizations;

Выберите библиотеку замещения кода

  1. Откройте диалоговое окно Параметры конфигурации.

  2. В диалоговом окне Параметров конфигурации установите правильные значения Device Vendor и Device Type в зависимости от цели оборудования. В этом примере Intel является поставщиком устройств и x86-64(Windows64) - тип устройства.

  3. На панели Интерфейс (Interface) установите параметр Библиотека замещения кода (Code Replacement Library) нажав кнопку Выбрать (Select) и добавив библиотеки замещения кода в область Библиотеки замещения выбранного кода (Selected code replacement libraries - priorited list). В данном примере выберите Intel SSE (Windows) и ScalarFcn. Библиотека ScalarFcn работает на платформах Windows. Пользователи Linux должны предоставить другую библиотеку.

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

Также используйте API командной строки, чтобы включить замену кода:

set_param('mMultiLibrary_abs','CodeReplacementLibrary','Intel SSE (Windows),ScalarFcn')

Сгенерируйте код для модели.

evalc('slbuild(model)');

ПРИМЕЧАНИЕ. При регистрации библиотеки замещения кода вы не можете использовать запятую в имени библиотеки замещения кода.

Просмотрите сгенерированный код с заменами. Вот фрагмент mMultiLibrary_abs.c.

cfile = fullfile('mMultiLibrary_abs_ert_rtw','mMultiLibrary_abs.c');
rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */
void mMultiLibrary_abs_step(void)
{
  int32_T i;

  /* Outport: '<Root>/Out1' incorporates:
   *  Abs: '<Root>/Abs1'
   *  Inport: '<Root>/In1'
   */
  mMultiLibrary_abs_Y.Out1 = CRL_abs_d(mMultiLibrary_abs_U.In1);
  for (i = 0; i <= 2498; i += 2) {
    /* Outport: '<Root>/Output' incorporates:
     *  Inport: '<Root>/In2'
     *  Inport: '<Root>/In3'
     */
    _mm_storeu_pd(&mMultiLibrary_abs_Y.Output[i], _mm_add_pd(_mm_loadu_pd
      (&mMultiLibrary_abs_U.In2[i]), _mm_loadu_pd(&mMultiLibrary_abs_U.In3[i])));
  }
}

Сгенерированный код содержит CRL_abs_d функция, активируемая библиотекой замены пользовательского кода ScalarFcn. Обратите внимание, что эта библиотека работает только для Windows. Цикл for использует функциональность SIMD через функцию _mm_add_pd активируется Intel SSE (Windows) библиотека замещения кода. Выбор нескольких библиотек замещения кода позволяет выполнить несколько оптимизаций в сгенерированном коде.

Закройте модель и отчет о генерации кода.

delete ./rtwTargetInfo.m
bdclose(model)
rtwdemoclean;

Ограничения:

  • При использовании нескольких библиотек замещения кода Intel SIMD упорядоченное расположение приоритетов игнорируется. Intel AVX512 имеет более высокий приоритет, чем AVX, который имеет более высокий приоритет по сравнению с SSE, независимо от порядка, заданного библиотекой замещения кода.

  • Когда вы используете различные типы аргументов, такие как матрица и скаляр, упорядоченное расположение приоритетов игнорируется. Библиотека замены матричного кода имеет более высокий приоритет, чем библиотека замены скалярного кода, независимо от порядка, заданного библиотекой замены кода.

  • Когда параметр библиотеки замещения кода задает стандартную Math Library, например, через BaseTfl, и он не соответствует параметру Standard Math Library, используется библиотека, заданная параметром Standard Math Library.

Похожие темы