Для создания функций MEX из кода MATLAB ®, использующего глобальные данные:
Объявите переменные глобальными в коде.
Определите и инициализируйте глобальные данные перед их использованием.
Дополнительные сведения см. в разделе Определение глобальных данных.
Скомпилировать код с помощью fiaccel.
При использовании глобальных данных необходимо также указать, требуется ли синхронизировать эти данные между MATLAB и сгенерированным кодом. При отсутствии взаимодействия между MATLAB и сгенерированным кодом можно отключить синхронизацию. В противном случае следует включить синхронизацию. Дополнительные сведения см. в разделе Синхронизация глобальных данных с MATLAB.
Для создания кода необходимо объявить глобальные переменные перед их использованием в коде MATLAB. Рассмотрим use_globals функция, использующая две глобальные переменные AR и B.
function y = use_globals() %#codegen % Turn off inlining to make % generated code easier to read coder.inline('never'); % Declare AR and B as global variables global AR; global B; AR(1) = B(1); y = AR * 2;
Глобальные данные можно определить в глобальной рабочей области MATLAB или в командной строке. Если глобальные данные не инициализируются в командной строке, fiaccel ищет переменную в глобальной рабочей области MATLAB. Если переменная не существует, fiaccel создает ошибку.
Для компиляции use_globals функция, описанная в объявлении глобальных переменных с помощью fiaccel:
Определите глобальные данные в рабочей области MATLAB. По запросу MATLAB введите:
global AR B;
AR = fi(ones(4),1,16,14);
B = fi([1 2 3],1,16,13);
Скомпилировать функцию для создания файла MEX с именем use_globalsx.
fiaccel -o use_globalsx use_globals
Для определения глобальных данных в командной строке используйте fiaccel
-global вариант. Например, для компиляции use_globals функция, описанная в объявлении глобальных переменных, укажите два глобальных входа AR и B в командной строке.
fiaccel -o use_globalsx ... -global {'AR',fi(ones(4)),'B',fi([1 2 3])} use_globals
Либо укажите тип и начальное значение с помощью -globals флаг с использованием формата -globals {'g', {type, initial_value}}.
Определение глобальных данных переменного размера. Чтобы предоставить начальные значения для глобальных данных переменного размера, укажите тип и начальное значение с помощью -globals флаг с использованием формата -globals {'g', {type, initial_value}}. Например, для задания глобальной переменной g1 с начальным значением [1 1] и верхняя граница [2 2], введите:
fiaccel foo -globals {'g1',{coder.typeof(0,[2 2],1),[1 1]}}
coder.typeof синтаксис, см. coder.typeof (Кодер MATLAB).Сгенерированный код и MATLAB имеют собственные копии глобальных данных. Для обеспечения согласованности необходимо синхронизировать их глобальные данные при каждом взаимодействии. Если данные не синхронизированы, их глобальные переменные могут отличаться. Уровень взаимодействия определяет время синхронизации глобальных данных.
По умолчанию синхронизация между глобальными данными в MATLAB и сгенерированным кодом происходит при вводе и выходе функции MEX и для всех внешних вызовов, которые являются вызовами функций MATLAB по пути MATLAB, fiaccel отправляет в MATLAB для выполнения. Такое поведение обеспечивает максимальную согласованность между сгенерированным кодом и MATLAB.
Для повышения производительности можно:
Используется для синхронизации только в точках входа и выхода функции MEX.
Отключить синхронизацию, если глобальные данные не взаимодействуют.
Выберите необходимость синхронизации до и после каждого внешнего вызова.
В следующей таблице представлены параметры глобальной синхронизации данных. Сведения о настройке этих параметров см. в разделе Как синхронизировать глобальные данные.
Параметры глобальной синхронизации данных
| Если хочешь... | Установите режим глобальной синхронизации данных в значение: | Синхронизировать до и после внешних вызовов? |
|---|---|---|
| Обеспечение максимальной согласованности при изменении глобальных данных всеми внешними вызовами. | At MEX-function entry, exit and extrinsic calls (по умолчанию) | Да. Поведение по умолчанию. |
| Убедитесь в максимальной согласованности, когда большинство внешних вызовов изменяют глобальные данные, но некоторые нет. | At MEX-function entry, exit and extrinsic calls (по умолчанию) | Да. Используйте |
| Убедитесь в максимальной согласованности, если большинство внешних вызовов не изменяют глобальные данные, а несколько. | At MEX-function entry and exit | Да. Используйте |
| Повышайте производительность при синхронизации глобальных данных, и ни один из внешних вызовов не изменяет глобальные данные. | At MEX-function entry and exit | Нет. |
| Обмен данными только между созданными кодовыми файлами. Отсутствие взаимодействия между глобальными данными в MATLAB и сгенерированным кодом. | Disabled | Нет. |
Для управления глобальной синхронизацией данных установите режим глобальной синхронизации данных и выберите, следует ли синхронизировать внешние функции. Инструкции по использованию параметров см. в разделе Когда синхронизировать глобальные данные.
Управление синхронизацией глобальных данных с внешними функциями осуществляется с помощью coder.extrinsic
-sync:on и -sync:off варианты.
Управление режимом глобальной синхронизации данных из командной строки
Определите объект параметров компилятора в рабочей области MATLAB путем ввода команды конструктора:
comp_cfg = coder.mexconfig
В командной строке установите GlobalDataSyncMethod свойство для Always, SyncAtEntryAndExits или NoSync, в зависимости от обстоятельств. Например:
comp_cfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
Используйте comp_cfg при компиляции кода путем его указания с помощью -config вариант компиляции. Например,
fiaccel -config comp_cfg myFile
Управление синхронизацией для внешних вызовов функций. Можно управлять тем, происходит ли синхронизация между глобальными данными в MATLAB и сгенерированным кодом до и после вызова внешней функции. Для этого используйте coder.extrinsic
-sync:on и -sync:off варианты.
По умолчанию глобальные данные:
Синхронизируется до и после каждого внешнего вызова, если режим глобальной синхронизации данных At MEX-function entry, exit and extrinsic calls. Если вы уверены, что некоторые внешние вызовы не влияют на глобальные данные, отключите синхронизацию для этих вызовов с помощью -sync:off вариант. Отключение синхронизации повышает производительность. Например, если функции foo1 и foo2
не влияйте на глобальные данные, отключите синхронизацию для следующих функций:
coder.extrinsic('-sync:off', 'foo1', 'foo2');
Не синхронизирован, если глобальный режим синхронизации данных At MEX-function entry and exit. Если код содержит несколько внешних вызовов, влияющих на глобальные данные, включите синхронизацию для этих вызовов с помощью -sync:on вариант. Например, если функции foo1 и foo2
влияют на глобальные данные, включают синхронизацию для следующих функций:
coder.extrinsic('-sync:on', 'foo1', 'foo2');
Не синхронизирован, если глобальный режим синхронизации данных Disabled. Если синхронизация отключена, управление синхронизацией для определенных внешних вызовов невозможно. -sync:on параметр не имеет эффекта.
Поскольку функции MEX и MATLAB имеют собственные копии глобальных данных, необходимо clear обе копии для обеспечения получения одинаковых результатов при последовательных запусках MEX. clear global удаляет только копию глобальных данных в рабочей области MATLAB. Чтобы удалить обе копии данных, используйте clear global и clear mex команды вместе. clear all команда также удаляет обе копии.
Нельзя использовать глобальные данные с coder.varsize функция. Вместо этого используйте coder.typeof объект для определения глобальных данных переменного размера, как описано в разделе Определение глобальных данных переменного размера.