Использование 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.

Чтобы применить эту оптимизацию,

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

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

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

Примечание

memcpy оптимизация может не происходить при определенные обстоятельства, в том числе когда другие оптимизации имеют более высокий приоритет, чем memcpy оптимизация или когда сгенерированный код происходит из кода Target Language Компилятора (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. Для каждого блока Selector установите параметр Index равным 1:50. Установите параметр Input port size равным 100.

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

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

  2. Перейдите на панель Code Generation > Report диалогового окна Параметров конфигурации и выберите параметр 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 диалогового окна Параметры конфигурации и выберите опцию 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));
    }

См. также

Похожие темы