memcpy
, чтобы оптимизировать сгенерированный код для векторных присвоенийМожно использовать параметр Use memcpy for vector assignment, чтобы оптимизировать сгенерированный код для векторных присвоений, заменяя циклы for
на вызовы функции memcpy
. Функция memcpy
более эффективна, чем for
- присвоение управляемого элемента цикла для больших наборов данных. Эта оптимизация улучшает скорость выполнения.
Выбор параметра Use memcpy for vector assignment включает связанному параметру Memcpy threshold (bytes), который позволяет вам задавать минимальный размер массивов в байтах, для которых вызовы функции memcpy
должны заменить циклы for
в сгенерированном коде. Для получения дополнительной информации смотрите Использование memcpy для векторного присвоения и порога Memcpy (байты). В рассмотрении, использовать ли эту оптимизацию,
Проверьте, что ваша цель поддерживает функцию 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
, которая будет использоваться в сгенерированном типовом кодексе. Для получения дополнительной информации смотрите Замену Функции Памяти Кода (Embedded Coder).
Чтобы исследовать результат использования параметра Use memcpy for vector assignment на сгенерированном векторном коде присвоения, создайте модель, которая генерирует присвоения сигнального вектора. Например,
Используйте В, и Селекторные блоки, чтобы создать следующую модель.
Откройте Model Explorer и сконфигурируйте Signal Attributes для исходных блоков In2
и In1
. Для каждого, устанавливает 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. Затем перейдите к панели 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 для векторного присвоения