Можно сделать динамические массивы в коде запущенными быстрее при помощи свойства CacheDynamicArrayDataPointer
настройки. Это свойство поднимает указатель данных на временную переменную. Эта временная переменная затем используется к данным о матрице права доступа в случае динамических массивов.
По умолчанию свойство включено для MEX, статической библиотеки, динамически подключаемой библиотеки и исполняемых настроек. Указатель данных о динамическом массиве кэша может снизить время выполнения динамических массивов, почти равняются времени выполнения статических массивов. Это свойство также помогает улучшить удобочитаемость кода во многих случаях.
Отключить свойство с помощью MATLAB® Приложение Coder™:
Откройте диалоговое окно Generate. На странице Generate Code кликните по стреле Generate.
Нажмите More Settings.
На вкладке Advanced, набор Cache dynamic array data к No
.
Отключить свойство в командной строке:
В рабочем пространстве MATLAB задайте объект настройки, с помощью coder.config
с аргументами 'mex'
, 'lib'
, 'dll'
, или 'exe'
(в зависимости от ваших требований).
cfg = coder.config('lib');
Установите CacheDynamicArrayDataPointer
свойство настройки возражает против false
:
cfg.CacheDynamicArrayDataPointer = false;
Сравните сгенерированный код C с активированным указателем данных о динамическом массиве кэша и отключенным указателем данных о динамическом массиве кэша.
Рассмотрите функцию matrixAdd
.
function c = matrixAdd(a,b) %#codegen c = a+b; end
Задайте настройку, возражают и генерируют код С при помощи codegen
команда.
Сгенерировать код С с включенным указателем данных о динамическом массиве кэша:
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
Сгенерировать код С с отключенным указателем данных о динамическом массиве кэша:
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) со спецификацией выравнивания данных