Оптимизируйте динамический массив доступ

Можно сделать динамические массивы в коде запущенными быстрее при помощи свойства CacheDynamicArrayDataPointer настройки. Это свойство поднимает указатель данных на временную переменную. Эта временная переменная затем используется к данным о матрице права доступа в случае динамических массивов.

По умолчанию свойство включено для MEX, статической библиотеки, динамически подключаемой библиотеки и исполняемых настроек. Указатель данных о динамическом массиве кэша может снизить время выполнения динамических массивов, почти равняются времени выполнения статических массивов. Это свойство также помогает улучшить удобочитаемость кода во многих случаях.

Отключите свойство указателя данных о динамическом массиве кэша

Отключить свойство с помощью MATLAB® Приложение Coder™:

  1. Откройте диалоговое окно Generate. На странице Generate Code кликните по стреле Generate.

  2. Нажмите More Settings.

  3. На вкладке Advanced, набор Cache dynamic array data к No.

Отключить свойство в командной строке:

  1. В рабочем пространстве MATLAB задайте объект настройки, с помощью coder.config с аргументами 'mex', 'lib', 'dll', или 'exe' (в зависимости от ваших требований).

    cfg = coder.config('lib');
  2. Установите CacheDynamicArrayDataPointer свойство настройки возражает против false:

    cfg.CacheDynamicArrayDataPointer = false;

Сравните сгенерированный код C

Сравните сгенерированный код C с активированным указателем данных о динамическом массиве кэша и отключенным указателем данных о динамическом массиве кэша.

Рассмотрите функцию matrixAdd.

function c = matrixAdd(a,b) %#codegen
c = a+b;
end

Задайте настройку, возражают и генерируют код С при помощи codegen команда.

  1. Сгенерировать код С с включенным указателем данных о динамическом массиве кэша:

    cfg = coder.config('lib');
    codegen -config cfg matrixAdd -args {coder.typeof(0, [1 Inf]), coder.typeof(0, [1 Inf])} -report
    Code generation successful: View report
  2. Сгенерировать код С с отключенным указателем данных о динамическом массиве кэша:

    cfg = coder.config('lib');
    cfg.CacheDynamicArrayDataPointer = false;
    codegen -config cfg matrixAdd -args {coder.typeof(0, [1 Inf]), coder.typeof(0, [1 Inf])} -report
    Code generation successful: View report

Откройте отчет и смотрите сгенерированный код.

Эта таблица сравнивает сгенерированные коды C. Когда свойство включено, временные переменные, такие как *a_data, *b_data, и *c_data включены в сгенерированный код. Использование временных переменных избавляет от необходимости разыменование двойного указателя получать доступ к матричным данным. Таким образом улучшая время выполнения динамических массивов в сгенерированном коде C.

Enabled указатель данных о динамическом массиве кэшаОтключенный указатель данных о динамическом массиве кэша
void matrixAdd(const emxArray_real_T *a, const emxArray_real_T *b,
               emxArray_real_T *c)
{
  double *a_data;
  double *b_data;
  double *c_data;
  int i;
  b_data = b->data;
  a_data = a->data;
  if (a->size[1] == b->size[1]) {
    int loop_ub;
    i = c->size[0] * c->size[1];
    c->size[0] = 1;
    c->size[1] = a->size[1];
    emxEnsureCapacity_real_T(c, i);
    c_data = c->data;
    loop_ub = a->size[1];
    for (i = 0; i < loop_ub; i++) {
      c_data[i] = a_data[i] + b_data[i];
    }
  } else {
    plus(c, a, b);
  }
}
void matrixAdd(const emxArray_real_T *a, const emxArray_real_T *b,
               emxArray_real_T *c)
{
  int i;
  if (a->size[1] == b->size[1]) {
    int loop_ub;
    i = c->size[0] * c->size[1];
    c->size[0] = 1;
    c->size[1] = a->size[1];
    emxEnsureCapacity_real_T(c, i);
    loop_ub = a->size[1];
    for (i = 0; i < loop_ub; i++) {
      c->data[i] = a->data[i] + b->data[i];
    }
  } else {
    plus(c, a, b);
  }
}

Ограничения

Указатель данных о динамическом массиве кэша не поддерживается для:

  • C++ coder::array

  • GPU Coder

  • Заменяющая библиотека кода (CRL) со спецификацией выравнивания данных

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

|

Похожие темы