Используйте 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) перемещать большие объемы данных, например, с помощью Селекторного блока.

Применять эту оптимизацию,

  1. Полагайте сначала, что генерирующий код без этой оптимизации и измерения ее скорости выполнения, устанавливает базовую линию для оценки оптимизированного присвоения.

  2. Выберите Use memcpy for vector assignment и исследуйте установку Memcpy threshold (bytes), который по умолчанию задает 64 байта как минимальный размер массивов для который memcpy вызовы функции заменяют for циклы. На основе размеров массивов, используемых в присвоениях сигнального вектора вашего приложения и факторах целевого окружения, которые могут опереться на пороговый выбор, принимают значение по умолчанию или задают другой размер массивов.

  3. Сгенерируйте код и измерьте его скорость выполнения против своих базовых или предыдущих итераций. Выполните итерации на шагах 2 и 3, пока вы не достигнете оптимального результата.

Примечание

memcpy оптимизация не может произойти при определенных обстоятельствах, включая то, когда другая оптимизация имеет более высокий приоритет, чем memcpy оптимизация, или когда сгенерированный код происходит из кода Компилятора выходного языка (TLC), такого как файл TLC, сопоставленный с Блоком s-function.

Примечание

Если вам лицензируют для программного обеспечения Embedded Coder®, можно использовать заменяющую библиотеку кода (CRL), чтобы обеспечить собственную реализацию memcpy функция, которая будет использоваться в сгенерированном типовом кодексе. Для получения дополнительной информации смотрите Замену Функции Памяти Кода.

Модель в качестве примера

Чтобы исследовать результат использования параметра Use memcpy for vector assignment на сгенерированном векторном коде присвоения, создайте модель, которая генерирует присвоения сигнального вектора. Например,

  1. Используйте In, Out и блоки Selector, чтобы создать следующую модель.

  2. Откройте Model Explorer и сконфигурируйте Signal Attributes для In1 и In2 исходные блоки. Для каждого, устанавливает Port dimensions на [1,100], и набор Data type к int32. Примените изменения и сохраните модель. В этом примере модель имеет имя vectorassign.

  3. Для каждого Селекторного блока, установленного параметр Index на 1:50. Установите параметр Input port size на 100.

Сгенерируйте код

  1. Параметр Use memcpy for vector assignment включен по умолчанию. Чтобы выключить параметр, перейдите к Optimization, разделяют на области и очищают параметр Use memcpy for vector assignment.

  2. Перейдите к Code Generation> панель Report диалогового окна Configuration Parameters и выберите параметр Create code generation report и параметр Open report automatically. Затем перейдите к панели Code Generation, выберите опцию Generate code only и сгенерируйте код для модели. Когда генерация кода завершается, отчет генерации кода HTML отображен.

  3. В отчете генерации кода 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];
      }
    }

Сгенерируйте код с оптимизацией

  1. Перейдите к панели Optimization диалогового окна Configuration Parameters и выберите опцию Use memcpy for vector assignment. Оставьте опцию Memcpy threshold (bytes) при ее настройке по умолчанию 64. Примените изменения и регенерируйте код для модели. Когда генерация кода завершается, отчет генерации кода HTML снова отображен.

  2. В отчете генерации кода 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));
    }

Смотрите также

Похожие темы