exponenta event banner

Внепроцессное выполнение функций C++ MEX

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 вне процесса:

  1. Напишите свою функцию C++ MEX и создайте ее с помощью инструкций в программе Build C++ MEX Programs. Между функциями, написанными для выполнения в процессе и вне процесса, нет требуемых кодовых различий.

  2. Создайте хост-процесс MEX с помощью mexhost функция.

  3. Используйте 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

Восстановление функции C++ MEX

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.

Получение информации о процессе MEX Host

Используйте matlab.mex.MexHost объект для получения информации о процессе хоста MEX. Эти свойства предоставляют информацию о процессе и загруженных функциях.

  • EnvironmentVariables содержит имена и значения переменных среды, заданных для процесса.

  • Functions содержит имена всех функций C++ MEX, загруженных в хост-процесс MEX.

  • ProcessName содержит имя хост-процесса MEX, которое MATLABMexHost по умолчанию.

  • ProcessIdentifier содержит идентификатор процесса.

Дополнительные сведения об этих свойствах см. в разделе matlab.mex.MexHost.

Всегда завершать процесс

В некоторых случаях может потребоваться выполнение функции C++ MEX вне процесса. Например, завершение процесса может потребоваться при наличии конфликтов библиотек сторонних производителей между MATLAB и функцией C++ MEX.

Чтобы обеспечить удобный способ запуска функции C++ MEX вне процесса, создайте обертку функции MATLAB. Функция оболочки создает объект-хост MEX и запускает функцию C++ MEX в этом процессе.

Например, предположим, что необходимо создать функцию-оболочку для arrayProduct.cpp Функция C++ 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 с именем root arrayProductMEX и помещает его в папку с функцией оболочки, которая считается MyPathFolder в этом примере. mex создает папку, если она не существует.

mex -output arrayProductMEX -outdir MyPathFolder arrayProduct.cpp

Для использования функции C++ MEX вызовите ее из командной строки, как и любую функцию, через функцию-оболочку.

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.

Отладка внепроцессных функций MEX

Отладчик C++ можно подключить к функции C++ MEX и установить точки останова для отладки программы. Ниже приведены шаги по настройке и отладке функции C++ MEX вне процесса.

  • Построить исходный код C++ MEX с помощью mex с помощью команды -g для включения символов отладки.

  • Создайте хост-процесс с помощью mexhost функция. Эта функция возвращает объект matlab.mex.MexHost.

  • Получение идентификатора процесса из matlab.mex.MexHost объект ProcessIdentifier собственность.

  • Используйте идентификатор процесса для присоединения отладчика C++ к процессу.

  • Вставьте точки останова в исходный код.

  • Запустите функцию C++ MEX вне процесса с помощью feval способ.

Сведения об использовании определенных отладчиков см. в документации по этим отладчикам.

Отладка с помощью Microsoft Visual Studio

  1. Убедитесь, что Visual Studio ® является выбранным компилятором C++. В этом примере используется Microsoft ® Visual Studio 2015.

    cpp = mex.getCompilerConfigurations('C++','Selected');
    cpp.Name
    ans =
    
        'Microsoft Visual C++ 2015'
  2. Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.

    mex -g myMexFunction.cpp
  3. Создайте хост-процесс MEX и верните MexHost объект.

    mh = mexhost;
  4. Запустите Visual Studio. Не выходите из сеанса MATLAB.

  5. В меню «Отладка Visual Studio» выберите «Присоединить к процессу».

    В диалоговом окне «Присоединение к процессу» выберите MATLABMexHost и нажмите кнопку «Присоединить».

  6. Visual Studio загружает данные, а затем отображает пустую панель кода.

  7. Откройте исходный файл C++ MEX, щелкнув Файл > Открыть > Файл и выбрав файл.

  8. Задайте точку останова, щелкнув правой кнопкой мыши нужную строку кода и выбрав в контекстном меню пункт «Точка останова» > «Вставить точку останова».

  9. В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost feval способ.

    result = feval(mh,'myMexFunction',input1,input2,...)
  10. Используйте функции отладчика для отладки исходного кода.

Отладка в системах Linux

В системах Linux ® можно использовать отладчик, например GNU ®gdb отладчик. Выполните следующие действия для использования gdb отладчик.

  1. Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.

    mex -g myMexFunction.cpp
  2. Создайте хост-процесс MEX и верните MexHost объект.

    mh = mexhost;
  3. Получение идентификатора процесса из ProcessIdentifier имущества MexHost объект. Возвращаемое значение представляет собой строку, представляющую идентификатор процесса хоста MEX. Например,

    mh.ProcessIdentifier
    ans = 
    
        "13892"

    Идентификатор процесса отличается для каждого созданного процесса.

  4. Подключите отладчик к хост-процессу MEX с терминала Linux. Например, использование GNU gdb отладчик, вызов gdb с именем файла C++ MEX и идентификатором процесса, полученным из объекта хоста MEX в MATLAB:

    gdb myMexFunction -pid=13892
  5. Установите точки разрыва в функции C++ MEX. Например, использование gdb, установите точку разрыва в myMexFunction.cpp в строке 21:

    break myMexFunction.cpp:21
  6. В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost feval способ.

    result = feval(mh,'myMexFunction',input1,input2,...)

    MATLAB ожидает ответа от отладчика.

  7. С терминала Linux используйте функции отладчика для отладки исходного кода.

Отладка в системах Macintosh

В системах Macintosh используйте отладчик LLDB.

  1. Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.

    mex -g myMexFunction.cpp
  2. Создайте хост-процесс MEX и верните MexHost объект.

    mh = mexhost;
  3. Получение идентификатора процесса из ProcessIdentifier имущества MexHost объект. Возвращаемое значение представляет собой строку, представляющую идентификатор процесса хоста MEX.

    mh.ProcessIdentifier
    ans = 
    
        "13892"

    Идентификатор процесса отличается для каждого созданного процесса.

  4. Подключите отладчик к хост-процессу MEX с терминала macOS. Звонить lldb с идентификатором процесса хоста MEX, полученным из объекта хоста MEX в MATLAB. Например, предполагается, что идентификатором процесса является 13892, подключите отладчик LLDB к этому процессу:

    lldb -p 13892
  5. Задайте точки разрыва в исходном коде. Например, эта команда задает точку разрыва в myMexFunction.cpp на строке № 21.

    breakpoint set -f myMexFunction.cpp -l 21
  6. В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost feval способ.

    result = feval(mh'myMexFunction',input1,input2,...)

    MATLAB ожидает ответа от отладчика.

  7. Войти C или continue с терминала macOS. Выполнение программы останавливается в точках останова.

  8. С терминала macOS используйте функции отладчика для отладки исходного кода.

См. также

|

Связанные темы