Можно сгенерировать код, который имеет замену кода, активированную несколькими библиотеками замены кода. Можно выбрать несколько библиотек замены кода в унифицированном рабочем процессе, чтобы сгенерированный код содержал оптимизации от различных библиотек замены кода, таких как 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;
Откройте диалоговое окно Параметры конфигурации.
В диалоговом окне Параметров конфигурации установите правильные значения Device Vendor и Device Type в зависимости от цели оборудования. В этом примере Intel
является поставщиком устройств и x86-64(Windows64)
- тип устройства.
На панели Интерфейс (Interface) установите параметр Библиотека замещения кода (Code Replacement Library) нажав кнопку Выбрать (Select) и добавив библиотеки замещения кода в область Библиотеки замещения выбранного кода (Selected code replacement libraries - priorited list). В данном примере выберите Intel SSE (Windows) и ScalarFcn. Библиотека ScalarFcn работает на платформах Windows. Пользователи Linux должны предоставить другую библиотеку.
Закажите библиотеки замещения кода в соответствии с приоритетом, в котором вы хотите видеть их замененными в сгенерированном коде. Библиотеки замещения кода в верхней части порядка имеют более высокий приоритет во время замены кода.
Также используйте 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.