Можно сгенерировать код, которому включили замены кода несколько заменяющих библиотек кода. Можно выбрать несколько библиотек Code Replacement в объединенном рабочем процессе так, чтобы сгенерированный код содержал оптимизацию от варьировавшихся заменяющих библиотек кода, таких как 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;
Откройте диалоговое окно Configuration Parameters.
В диалоговом окне Configuration Parameters, набор Поставщик правильного устройства и Тип устройства в зависимости от аппаратной цели. В этом примере Intel
Поставщик Устройства и x86-64(Windows64)
Тип устройства.
На Интерфейсной панели, установленном Заменяющем параметре Библиотеки Кода путем нажатия на Select и добавления заменяющих библиотек кода в Выбранные заменяющие библиотеки кода - приоритизированная панель списка. В данном примере выберите 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, независимо от порядка, заданного заменяющей библиотекой кода.
Когда вы используете различные типы аргумента, такие как матрица и скаляр, упорядочение по приоритетам проигнорировано. Заменяющая библиотека матрицы A кода имеет более высокий приоритет, чем скалярная заменяющая библиотека кода, независимо от порядка, заданного заменяющей библиотекой кода.
Когда заменяющий параметр библиотеки кода задает Стандартную Математическую Библиотеку, например, через ее BaseTfl, и он не совпадает со Стандартным Математическим параметром Библиотеки, библиотекой, заданной Стандартным Математическим параметром Библиотеки, пользуются.