memcpy
Функция, чтобы оптимизировать сгенерированный код для векторных присвоенийМожно использовать параметр Use memcpy for vector assignment, чтобы оптимизировать сгенерированный код для векторных присвоений, заменяя for
циклы с memcpy
вызовы функции. memcpy
функция более эффективна, чем for
- присвоение управляемого элемента цикла для больших наборов данных. Эта оптимизация улучшает скорость выполнения.
Выбор параметра Use memcpy for vector assignment включает связанному параметру Memcpy threshold (bytes), который позволяет вам задавать минимальный размер массивов в байтах для который memcpy
вызовы функции должны заменить for
циклы в сгенерированном коде. Для получения дополнительной информации смотрите Использование memcpy для векторного присвоения (Simulink Coder) и порог Memcpy (байты) (Simulink Coder). В рассмотрении, использовать ли эту оптимизацию,
Проверьте, что ваша цель поддерживает memcpy
функция.
Определите, использует ли ваша модель присвоения сигнального вектора (такие как Y=expression
) перемещать большие объемы данных, например, с помощью Селекторного блока.
Применять эту оптимизацию,
Полагайте сначала, что генерирующий код без этой оптимизации и измерения ее скорости выполнения, устанавливает базовую линию для оценки оптимизированного присвоения.
Выберите Use memcpy for vector assignment и исследуйте установку Memcpy threshold (bytes), который по умолчанию задает 64 байта как минимальный размер массивов для который memcpy
вызовы функции заменяют for
циклы. На основе размеров массивов, используемых в присвоениях сигнального вектора вашего приложения и факторах целевого окружения, которые могут опереться на пороговый выбор, принимают значение по умолчанию или задают другой размер массивов.
Сгенерируйте код и измерьте его скорость выполнения против своих базовых или предыдущих итераций. Выполните итерации на шагах 2 и 3, пока вы не достигнете оптимального результата.
memcpy
оптимизация не может произойти при определенных обстоятельствах, включая то, когда другая оптимизация имеет более высокий приоритет, чем memcpy
оптимизация, или когда сгенерированный код происходит из кода Компилятора выходного языка (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
.
Для каждого Селекторного блока, установленного параметр Index на 1:50
. Установите параметр Input port size на 100
.
Параметр Use memcpy for vector assignment включен по умолчанию. Чтобы выключить параметр, перейдите к Optimization, разделяют на области и очищают параметр Use memcpy for vector assignment.
Перейдите к Code Generation> панель Report диалогового окна Configuration Parameters и выберите параметр 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 диалогового окна Configuration Parameters и выберите опцию 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 в векторном присвоении