Чтобы сгенерировать 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 Coder).Сгенерированный код и MATLAB имеют свои собственные копии глобальных данных. Для обеспечения согласованности необходимо синхронизировать их глобальные данные каждый раз, когда они взаимодействуют. Если вы не синхронизируете данные, их глобальные переменные могут отличаться. Уровень взаимодействия определяет, когда синхронизировать глобальные данные.
По умолчанию синхронизация между глобальными данными в код MATLAB и сгенерированным кодом происходит при входе и выходе MEX-функции и для всех extrinsic вызовов, которые являются вызовами функций 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
. Когда синхронизация отключена, вы не можете управлять синхронизацией для определенных внешних вызовов. The -sync:on
опция не влияет.
Поскольку MEX-функции и MATLAB имеют свои собственные копии глобальных данных, вы должны clear
обе копии для обеспечения того, чтобы последовательные запуски MEX давали одинаковые результаты. The clear global
команда удаляет только копию глобальных данных в рабочем пространстве MATLAB. Чтобы удалить обе копии данных, используйте clear global
и clear mex
команды вместе. The clear all
команда также удаляет обе копии.
Вы не можете использовать глобальные данные с coder.varsize
функция. Вместо этого используйте coder.typeof
объект для определения глобальных данных переменного размера, как описано в разделе «Определение глобальных данных переменного размера».