exponenta event banner

Преобразовать копии данных в назначения указателей

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

Настройка модели для оптимизации сгенерированного кода для назначения векторных сигналов

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

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

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

  3. На панели Оптимизация (Optimization) параметр Использовать memcpy для назначения вектора (Use memcpy for vector assignment), который включен по умолчанию, включает соответствующий параметр порога Memcpy (bytes).

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

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

Рассмотрим следующую модель с именем rtwdemo_pointer_conversion. Эта модель использует блок Switch для назначения данных векторному сигналу. Этот сигнал затем подается в блок выбора шины.

Создание кода без оптимизации

  1. В диалоговом окне «Параметры конфигурации» снимите флажок «Использовать memcpy для назначения вектора».

  2. Создайте временную папку для процесса сборки и проверки.

  3. Нажмите Ctrl + B, чтобы создать код.

### Starting build procedure for: rtwdemo_pointer_conversion
### Successful completion of build procedure for: rtwdemo_pointer_conversion

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                                    
===========================================================================================================
rtwdemo_pointer_conversion  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 12.179s

Просмотр созданного кода без оптимизации. Вот часть rtwdemo_pointer_conversion.c .

/* Model step function */
void rtwdemo_pointer_conversion_step(void)
{
  int32_T i;
  int16_T rtb_dataX[100];
  int16_T rtb_dataY[100];

  /* Switch generated from: '<Root>/Switch' incorporates:
   *  Constant: '<Root>/Constant'
   *  Constant: '<Root>/Constant1'
   *  Constant: '<Root>/Constant2'
   *  Constant: '<Root>/Constant3'
   *  Inport: '<Root>/In1'
   */
  for (i = 0; i < 100; i++) {
    if (rtU.In1) {
      rtb_dataX[i] = rtCP_Constant_Value[i];
      rtb_dataY[i] = rtCP_Constant1_Value[i];
    } else {
      rtb_dataX[i] = rtCP_Constant2_Value[i];
      rtb_dataY[i] = rtCP_Constant3_Value[i];
    }
  }

  /* End of Switch generated from: '<Root>/Switch' */

  /* S-Function (sfix_look1_dyn): '<Root>/Lookup Table Dynamic' incorporates:
   *  Inport: '<Root>/In2'
   *  Outport: '<Root>/Out1'
   */
  /* Dynamic Look-Up Table Block: '<Root>/Lookup Table Dynamic'
   * Input0  Data Type:  Integer        S16
   * Input1  Data Type:  Integer        S16
   * Input2  Data Type:  Integer        S16
   * Output0 Data Type:  Integer        S16
   * Lookup Method: Linear_Endpoint
   *
   */
  LookUp_S16_S16( &(rtY.Out1), &rtb_dataY[0], rtU.In2, &rtb_dataX[0], 99U);
}

Без оптимизации созданный код содержит for назначение элементов, управляемых контуром.

Включить оптимизацию и создать код

  1. В диалоговом окне Параметр конфигурации (Configuration Parameter) выберите параметр Использовать memcpy для назначения вектора (Use memcpy for vector assignment parameter).

  2. Создать код.

### Starting build procedure for: rtwdemo_pointer_conversion
### Successful completion of build procedure for: rtwdemo_pointer_conversion

Build Summary

Top model targets built:

Model                       Action                       Rebuild Reason                   
==========================================================================================
rtwdemo_pointer_conversion  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.7114s

Просмотр созданного кода без оптимизации. Вот часть rtwdemo_pointer_conversion.c.

/* Model step function */
void rtwdemo_pointer_conversion_step(void)
{
  const int16_T *rtb_dataX_0;
  const int16_T *rtb_dataY_0;

  /* Inport: '<Root>/In1' */
  if (rtU.In1) {
    /* Switch generated from: '<Root>/Switch' incorporates:
     *  Constant: '<Root>/Constant'
     */
    rtb_dataX_0 = &rtCP_Constant_Value[0];

    /* Switch generated from: '<Root>/Switch' incorporates:
     *  Constant: '<Root>/Constant1'
     */
    rtb_dataY_0 = &rtCP_Constant1_Value[0];
  } else {
    /* Switch generated from: '<Root>/Switch' incorporates:
     *  Constant: '<Root>/Constant2'
     */
    rtb_dataX_0 = &rtCP_Constant2_Value[0];

    /* Switch generated from: '<Root>/Switch' incorporates:
     *  Constant: '<Root>/Constant3'
     */
    rtb_dataY_0 = &rtCP_Constant3_Value[0];
  }

  /* End of Inport: '<Root>/In1' */

  /* S-Function (sfix_look1_dyn): '<Root>/Lookup Table Dynamic' incorporates:
   *  Inport: '<Root>/In2'
   *  Outport: '<Root>/Out1'
   */
  /* Dynamic Look-Up Table Block: '<Root>/Lookup Table Dynamic'
   * Input0  Data Type:  Integer        S16
   * Input1  Data Type:  Integer        S16
   * Input2  Data Type:  Integer        S16
   * Output0 Data Type:  Integer        S16
   * Lookup Method: Linear_Endpoint
   *
   */
  LookUp_S16_S16( &(rtY.Out1), &rtb_dataY_0[0], rtU.In2, &rtb_dataX_0[0], 99U);
}

Поскольку установка параметра Memcpy threshold (bytes) ниже размеров массива в сгенерированном коде, оптимизированный код содержит назначения указателей для назначения векторного сигнала.

См. также

|

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