MATLAB® может запускать функции C++ MEX в отдельном процессе. Выполнение функции C++ MEX в отдельном процессе позволяет вам:
Изолируйте процесс MATLAB от сбоев в функции C++ MEX.
Используйте некоторые сторонние библиотеки в функции C++ MEX, которые не совместимы с MATLAB.
Сохраните память, запустив несколько функций C++ MEX в одном процессе.
Присоедините отладчики C++ к процессу хоста MEX.
Прерывание выполнения функции C++ MEX с помощью Ctrl+C
Примечание
Размер переменных, переданных между C++ и MATLAB, ограничивается 2 ГБ при вызове функции C++ вне процесса. Этот предел распространяется на данные плюс вспомогательная информация, переданная между процессами.
Выполните следующие действия, чтобы запустить функцию C++ MEX вне процесса:
Напишите свою функцию C++ MEX и создайте ее с помощью инструкций в Build C++ MEX Programs. Нет необходимых различий в коде между функциями, записанными для выполнения в процессе и вне процесса.
Создайте хост-процесс MEX с помощью mexhost
функция.
Используйте feval
метод matlab.mex.MexHost
объект, возвращенный mexhost
чтобы запустить функцию C++ MEX в процессе хоста.
Когда процесс заканчивается, функции C++ MEX всегда выполняются в той же папке, что и текущая папка MATLAB. Изменение текущей папки MATLAB после создания объекта хоста MEX приводит к тому же изменению в контексте функции C++ MEX.
arrayProduct
MEX-функция вне процессаВ следующем примере запускается arrayProduct
C++ MEX-функция вне процесса. Исходный код C++ MEX доступен в файле arrayProduct.cpp
. Чтобы использовать этот пример функции C++ MEX, откройте arrayProduct.cpp
исходный файл, сохраните его в пути MATLAB и создайте функцию C++ MEX с помощью инструкций в Build C++ MEX Programs.
После создания функции C++ MEX запустите процесс хоста MEX с помощью mexhost
функция. Эта функция возвращает объект matlab.mex.MexHost
класс.
Используйте feval
метод для запуска arrayProduct
C++ MEX-функция в процессе хоста. Передайте имя функции C++ MEX и аргументы в feval
. Верните результаты в MATLAB, присвоив выход feval
.
mh = mexhost;
result = feval(mh,'arrayProduct',2,[1 2 3 4])
result = 2 4 6 8
Управляемый arrayProduct
в другом процессе узла MEX. Сначала создайте хост-процесс MEX путем вызова mexhost
снова и присвоение выхода другой переменной. Затем позвоните feval
на новом узле.
mh2 = mexhost;
result2 = feval(mh2,'arrayProduct',2,rand(1,10));
Можно запустить другие функции C++ MEX в том же процессе, используя ту же matlab.mex.MexHost
объект, возвращенный mexhost
.
result2 = feval(mh2,'anotherMexFunction',inputs);
Жизненный цикл процесса хоста MEX связан с жизненным циклом matlab.mex.MexHost
объект, возвращенный mexhost
. Как и любой объект указатель, MATLAB вызывает delete
метод, когда объект больше не ссылается нигде. Если MATLAB вызывает delete
или если вы звоните delete
на объекте явно MATLAB завершает процесс, связанный со MexHost
объект.
Вы можете завершить процесс явно, вызвав clear
функция с любым из следующих опций:
clear
переменная, возвращенная mexhost
функция
clear
classes
, clear
java
, или clear
all
mex
команда автоматически выгружает функции C++ MEX перед их перестройкой. Поэтому вам не нужно явно выгружать функции C++ MEX из процесса хоста MEX.
Можно явно выгрузить все функции C++ MEX из процесса хоста MEX путем вызова clear
mex
или clear
functions
. Выгрузите определенную функцию C++ MEX путем вызова clear
по имени функции.
Чтобы предотвратить выгрузку функции C++ MEX, используйте mexLock
функция. Чтобы разблокировать функцию C++ MEX, используйте mexUnlock
. Эти функции устанавливают или отменяют флаг для функции C++ MEX на хост-процессе, чтобы управлять выгрузкой функций C++ MEX.
Используйте matlab.mex.MexHost
объект для получения информации о процессе узла MEX. Эти свойства предоставляют информацию о процессе и загруженных функциях.
EnvironmentVariables
содержит имена и значения переменных окружения, установленных для процесса.
Functions
содержит имена всех функций C++ MEX, загруженных в процесс хоста MEX.
ProcessName
содержит имя хост-процесса MEX, а именно MATLABMexHost
по умолчанию.
ProcessIdentifier
содержит идентификатор процесса.
Для получения дополнительной информации об этих свойствах смотрите matlab.mex.MexHost
.
В некоторых случаях можно всегда хотеть запустить функцию C++ MEX вне процесса. Например, исчерпание процесса может потребоваться, если существуют конфликты между MATLAB и функцией C++ MEX сторонней библиотеки.
Чтобы обеспечить удобный способ запустить функцию C++ MEX вне процесса, создайте оберточную функцию MATLAB. Функция wrapper создает объект хоста MEX и запускает функцию C++ MEX в этом процессе.
Например, предположим, что вы хотите создать функцию обертки для arrayProduct.cpp
MEX-функция, которая включена в документацию в качестве примера. Создайте функцию MATLAB с именем arrayProduct.m
и поместите этот файл в папку, расположенную в пути MATLAB. Создайте функцию C++ MEX и присвойте другое имя скомпилированному файлу MEX.
Функция обертки создает matlab.mex.MexHost
объект, который назначается постоянной переменной, чтобы процесс не был уничтожен между последующими вызовами функции оболочки. Функция использует этот объект, чтобы вызвать feval
метод непроцессного выполнения функции C++ MEX. Если объект хоста MEX недопустим, функция создает процесс хоста MEX.
function result = arrayProduct(scalefactor,inputarray) persistent mh if ~(isa(mh,'matlab.mex.MexHost') && isvalid(mh)) mh = mexhost; end result = feval(mh,"arrayProductMEX",scalefactor,inputarray); end
Чтобы создать функцию C++ MEX, откройте arrayProduct.cpp
исходный файл и сохраните его в пути MATLAB. Создайте функцию C++ MEX, используя инструкции в этой теме, Сборка программ C++ MEX.
Следующая команда создает файл MEX с корневым именем arrayProductMEX
и помещает его в папку с функцией обертки, которая принята MyPathFolder
в этом примере. mex
команда создает папку, если она не существует.
mex -output arrayProductMEX -outdir MyPathFolder arrayProduct.cpp
Чтобы использовать функцию C++ MEX, вызовите ее из командной строки, как любую функцию через функцию wrapper.
result = arrayProduct(2,[1 2 3 4]); result
result = 2 4 6 8
Следующий код вызывает функцию C++ MEX в for
цикл. Первый вызов на arrayProduct
создает хост-процесс MEX. Последующие вызовы используют тот же процесс, если процесс не разрушен, например, сбоем функции C++ MEX.
for k = 1:5 results(k,:) = arrayProduct(k,[1 2 3 4]); end results
results = 1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16 5 10 15 20
Чтобы уничтожить процесс хоста MEX, очистите все функции, которые определяют переменную процесса хоста MEX (mh
в этом примере) как стойкий. В этом примере очистите arrayProduct.m
функция.
clear arrayProduct.m
Вызывающие clear
functions
вызывает разрушение matlab.mex.MexHost
объект, который хранится в постоянной переменной и поэтому завершает процесс хоста MEX.
Вы можете прикрепить отладчик C++ к функции C++ MEX и задать точки пропуска, чтобы отлажить программу. Вот шаги, чтобы настроить и отлажить функцию C++ MEX вне процесса.
Создайте исходный код C++ MEX с помощью mex
команда со -g
опция включения отладочных символов.
Создайте хост-процесс с помощью mexhost
функция. Эта функция возвращает объект matlab.mex.MexHost
.
Получите идентификатор процесса из matlab.mex.MexHost
ProcessIdentifier объекта
свойство.
Используйте идентификатор процесса, чтобы прикрепить отладчик C++ к процессу.
Вставьте точки останова в исходный код.
Запустите функцию C++ MEX вне процесса с помощью feval
способ.
Для получения информации об использовании определенных отладчиков см. документацию для этих отладчиков.
Убедитесь, что Visual Studio® - выбранный вами компилятор C++. Этот пример использует Microsoft® Visual Studio 2015.
cpp = mex.getCompilerConfigurations('C++','Selected'); cpp.Name
ans = 'Microsoft Visual C++ 2015'
Создайте свой исходный код C++ MEX с помощью mex
команда со -g
опция. Этот пример предполагает, что у вас есть исходный файл C++ MEX с именем myMexFunction.cpp
.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и вернитесь к MexHost
объект.
mh = mexhost;
Запуск Visual Studio. Не выходите из сеанса работы с MATLAB.
В меню Отладка Visual Studio выберите Присоединить к процессу.
В диалоговом окне «Присоединить к процессу» выберите MATLABMexHost
обработать и нажатие кнопки».
Visual Studio загружает данные, а затем отображает пустую панель кода.
Откройте исходный файл C++ MEX, нажав File > Open > File и выбрав файл.
Установите точку останова, щелкнув правой кнопкой мыши нужную строку кода и выбрав в контекстном меню Breakpoint > Insert Breakpoint.
В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost
feval
способ.
result = feval(mh,'myMexFunction',input1,input2,...)
Используйте функции, предоставленные отладчиком, для отладки исходного кода.
На Linux® системы, можно использовать отладчик, такой как GNU®
gdb
отладчик. Выполните следующие действия, чтобы использовать gdb
отладчик.
Создайте свой исходный код C++ MEX с помощью mex
команда со -g
опция. Этот пример предполагает, что у вас есть исходный файл C++ MEX с именем myMexFunction.cpp
.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и вернитесь к MexHost
объект.
mh = mexhost;
Получите идентификатор процесса из ProcessIdentifier
свойство MexHost
объект. Возвращенное значение представляет собой строку, представляющую идентификатор процесса узла MEX. Для примера,
mh.ProcessIdentifier
ans = "13892"
Идентификатор процесса отличается для каждого созданного процесса.
Присоедините отладчик к процессу хоста MEX с терминала Linux. Например, использование GNU gdb
отладчик, вызов gdb
с именем файла MEX на C++ и идентификатором процесса, который вы получили от объекта хоста MEX в MATLAB:
gdb myMexFunction -pid=13892
Установите пропуски в функции C++ MEX. Для примера используйте gdb
, установите точку пропуска в myMexFunction.cpp
на линии 21:
break myMexFunction.cpp:21
Из MATLAB запустите функцию C++ MEX вне процесса, используя matlab.mex.MexHost
feval
способ.
result = feval(mh,'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
С терминала Linux используйте функции, предоставляемые отладчиком, для отладки исходного кода.
В системах Macintosh используйте отладчик LLDB.
Создайте свой исходный код C++ MEX с помощью mex
команда со -g
опция. Этот пример предполагает, что у вас есть исходный файл C++ MEX с именем myMexFunction.cpp
.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и вернитесь к MexHost
объект.
mh = mexhost;
Получите идентификатор процесса из ProcessIdentifier
свойство MexHost
объект. Возвращенное значение представляет собой строку, представляющую идентификатор процесса узла MEX.
mh.ProcessIdentifier
ans = "13892"
Идентификатор процесса отличается для каждого созданного процесса.
Присоедините отладчик к процессу хоста MEX с терминала macOS. Функции lldb
с идентификатором процесса хоста MEX, полученным из объекта хоста MEX в MATLAB. Для примера предположим, что идентификатор процесса 13892
, присоедините отладчик LLDB к этому процессу:
lldb -p 13892
Установите точки пропуска в исходном коде. Для примера эта команда устанавливает пропуску точку в myMexFunction.cpp
на линии № 21.
breakpoint set -f myMexFunction.cpp -l 21
Из MATLAB запустите функцию C++ MEX вне процесса, используя matlab.mex.MexHost
feval
способ.
result = feval(mh'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
<reservedrangesplaceholder1> <reservedrangesplaceholder0>
или
continue
с терминала macOS. Выполнение программы останавливается в точках останова.
С macOS Terminal используйте функции, предоставляемые отладчиком, для отладки исходного кода.