Можно сделать динамические массивы в коде запущенными быстрее при помощи свойства 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) со спецификацией выравнивания данных