memcpy
Функция для оптимизации сгенерированного кода для назначений векторовМожно использовать параметр Use memcpy for vector assignment, чтобы оптимизировать сгенерированный код для назначений векторов путем замены for
циклы с memcpy
вызовы функций. memcpy
функция эффективнее, чем for
-loop назначение управляемого элемента для больших наборов данных. Эта оптимизация улучшает скорость выполнения.
Выбор параметра Use memcpy for vector assignment включает связанное Memcpy threshold (bytes) параметра, которое позволяет вам задать минимальный размер массива в байтах, для которых memcpy
вызовы функций должны быть заменены for
циклы в сгенерированном коде. Для получения дополнительной информации смотрите Использовать memcpy для назначения векторов и порог Memcpy (байты). Принимая во внимание, использовать ли эту оптимизацию,
Проверьте, что ваш целевой объект поддерживает memcpy
функция.
Определите, использует ли ваша модель назначения векторов сигналов (таких как Y=expression
) для перемещения больших объемов данных, например, с помощью блока Selector.
Чтобы применить эту оптимизацию,
Рассмотрите первую генерацию кода без этой оптимизации и измерения скорости его выполнения, чтобы установить базовый уровень для оценки оптимизированного назначения.
Выберите Use memcpy for vector assignment и исследуйте настройку Memcpy threshold (bytes), которая по умолчанию задает 64 байта в качестве минимального размера массива, для которого memcpy
вызовы функций заменяются for
циклы. Основываясь на размерах массивов, используемых в назначениях векторов сигналов вашего приложения, и факторах целевого окружения, которые могут иметь отношение к выбору порога, примите значение по умолчанию или задайте другой размер массива.
Сгенерируйте код и измерьте его скорость выполнения относительно вашего базового уровня или предыдущих итераций. Итерация на шагах 2 и 3 до достижения оптимального результата.
Примечание
memcpy
оптимизация может не происходить при определенные обстоятельства, в том числе когда другие оптимизации имеют более высокий приоритет, чем memcpy
оптимизация или когда сгенерированный код происходит из кода Target Language Компилятора (TLC), такого как файл TLC, сопоставленный с Блоком s-function.
Примечание
Если вы лицензированы для Embedded Coder® программное обеспечение, вы можете использовать библиотеку замены кода (CRL), чтобы обеспечить вашу собственную пользовательскую реализацию memcpy
функция для использования в сгенерированном коде модели. Для получения дополнительной информации смотрите Замена кода функции памяти.
Чтобы изучить результат использования параметра Use memcpy for vector assignment на сгенерированном коде назначения векторов, создайте модель, которая генерирует назначения векторов сигналов. Для примера,
Используйте In, Out и Selector блоки, чтобы создать следующую модель.
Откройте Model Explorer и сконфигурируйте Signal Attributes для In1
и In2
исходные блоки. Для каждого установите Port dimensions равным [1,100]
, и установите Data type равным int32
. Применить изменения и сохранить модель. В этом примере модель имеет имя vectorassign
.
Для каждого блока Selector установите параметр Index равным 1:50
. Установите параметр Input port size равным 100
.
Параметр Use memcpy for vector assignment включен по умолчанию. Чтобы выключить параметр, перейдите на панель Optimization и очистите параметр Use memcpy for vector assignment.
Перейдите на панель Code Generation > Report диалогового окна Параметров конфигурации и выберите параметр Create code generation report и Open report automatically. Затем перейдите на панель Code Generation, выберите опцию Generate code only и сгенерируйте код для модели. Когда генерация кода завершается, отображается отчет генерации кода HTML.
В отчете генерации кода HTML щелкните vectorassign.c
сечение и осмотр функции шага модели. Заметьте, что назначения векторов реализованы с помощью for
циклы.
/* Model step function */ void vectorassign_step(void) { int32_T i; for (i = 0; i < 50; i++) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' */ vectorassign_Y.Out1[i] = vectorassign_U.In1[i]; /* Outport: '<Root>/Out2' incorporates: * Inport: '<Root>/In2' */ vectorassign_Y.Out2[i] = vectorassign_U.In2[i]; } }
Перейдите на панель Optimization диалогового окна Параметры конфигурации и выберите опцию Use memcpy for vector assignment. Оставьте опцию Memcpy threshold (bytes) при значении по умолчанию 64
. Примените изменения и перегенерируйте код для модели. После завершения генерации кода снова отображается отчет генерации кода HTML.
В отчете генерации кода HTML щелкните vectorassign.c
и осмотрите выходную функцию модели. Заметьте, что назначения векторов теперь реализованы с помощью memcpy
вызовы функций.
/* Model step function */ void vectorassign_step(void) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' */ memcpy(&vectorassign_Y.Out1[0], &vectorassign_U.In1[0], 50U * sizeof(real_T)); /* Outport: '<Root>/Out2' incorporates: * Inport: '<Root>/In2' */ memcpy(&vectorassign_Y.Out2[0], &vectorassign_U.In2[0], 50U * sizeof(real_T)); }
Используйте memcpy для назначения векторов