exponenta event banner

Использовать memcpy Функция оптимизации сгенерированного кода для векторных назначений

Параметр Использовать memcpy для назначения вектора можно использовать для оптимизации созданного кода для назначения вектора путем замены for петли с memcpy вызовы функций. memcpy функция более эффективна, чем for-закольцовывание назначения управляемых элементов для больших наборов данных. Эта оптимизация повышает скорость выполнения.

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

  • Убедитесь, что конечный объект поддерживает memcpy функция.

  • Определите, использует ли модель назначение вектора сигнала (например, Y=expression) для перемещения больших объемов данных, например, с помощью блока селектора.

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

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

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

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

Примечание

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

Примечание

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

Пример модели

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

  1. Блоки «Вход», «Выход» и «Выбор» используются для создания следующей модели.

  2. Откройте обозреватель моделей и настройте атрибуты сигнала для In1 и In2 исходные блоки. Для каждого из них задайте для параметра «Размеры порта» значение [1,100]и задайте для параметра Тип данных значение int32. Примените изменения и сохраните модель. В этом примере модель имеет имя vectorassign.

  3. Для каждого блока селектора установите для параметра «Индекс» значение 1:50. Задайте для параметра Input port size значение 100.

Создать код

  1. Параметр Использовать memcpy для назначения вектора включен по умолчанию. Чтобы отключить параметр, перейдите на панель Оптимизация (Optimization) и снимите флажок Использовать memcpy для назначения вектора (Use memcpy for vector assignment parameter).

  2. Перейдите на панель «Создание кода» > «Отчет» диалогового окна «Параметры конфигурации» и выберите параметры «Создать отчет о создании кода» и «Открыть отчет автоматически». Затем перейдите на панель Создание кода (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) и выберите опцию Использовать memcpy для назначения вектора (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));
    }

См. также

Связанные темы