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

MATLAB® может запустить MEX-функции C++ в отдельном процессе. Выполнение MEX-функции C++ в отдельном процессе позволяет:

  • Изолируйте процесс MATLAB от катастрофических отказов в MEX-функции C++.

  • Пользуйтесь некоторыми сторонними библиотеками в MEX-функции C++, которые не совместимы с MATLAB.

  • Сохраните память путем выполнения нескольких MEX-функций C++ в одном процессе.

  • Присоедините отладчики C++ к хост-процессу MEX.

  • Прервите выполнение MEX-функции C++ с помощью Ctrl+C

Как у закончиться процесс

Выполните эти шаги, чтобы запустить вашу MEX-функцию C++ из процесса:

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

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

  3. Используйте метод feval объекта matlab.mex.MexHost, возвращенного mexhost, чтобы запустить вашу MEX-функцию C++ в хост-процессе.

При исчерпывании процесса MEX-функции C++ всегда выполняются в той же папке как текущая папка MATLAB. Изменение текущей папки MATLAB после создания объекта хоста MEX приводит к тому же изменению в контексте MEX-функции C++.

Выполнение arrayProduct MEX-функция Из Процесса

Следующий пример запускает MEX-функцию C++ arrayProduct из процесса. Исходный код C++ MEX доступен в файле arrayProduct.cpp. Чтобы использовать этот пример MEX-функция C++, откройте исходный файл arrayProduct.cpp, сохраните его на вашем пути MATLAB и создайте MEX-функцию C++ с помощью инструкций в Сборке Программы C++ MEX.

После создания MEX-функции C++ запустите хост-процесс MEX с помощью функции mexhost. Эта функция возвращает объект класса matlab.mex.MexHost.

Используйте метод feval, чтобы запустить MEX-функцию C++ arrayProduct в хост-процессе. Передайте имя MEX-функций C++ и аргументы к 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));

Можно запустить другие MEX-функции C++ в том же процессе с помощью того же объекта 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 автоматически разгружает MEX-функции C++ прежде, чем восстановить их. Поэтому вы не должны явным образом разгружать MEX-функции C++ от хост-процесса MEX.

Можно явным образом разгрузить все MEX-функции C++ от хост-процесса MEX путем вызова clear mex или clear functions. Разгрузите определенную MEX-функцию C++ путем вызова clear на имени функции.

Чтобы предотвратить разгрузку MEX-функции C++, используйте функцию mexLock. Чтобы разблокировать MEX-функцию C++, используйте mexUnlock. Эти функции набор или сброс флаг для MEX-функции C++ на хост-процессе, чтобы управлять разгрузкой MEX-функций C++.

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

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

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

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

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

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

У всегда заканчивайся процесс

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

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

Например, предположите, что вы хотите создать функцию обертки для MEX-функции C++ arrayProduct.cpp, которая включена в документацию как пример. Создайте функцию MATLAB с именем arrayProduct.m и поместите этот файл в папку, которая находится на пути MATLAB. Создайте MEX-функцию C++ и присвойте другое имя для скомпилированного файла MEX.

Функция обертки создает объект matlab.mex.MexHost, который присвоен персистентной переменной так, чтобы процесс не был уничтожен между последующими вызовами функции обертки. Функция использует этот объект вызвать метод feval для выполнения из процесса MEX-функции C++. Если объект хоста 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

Чтобы создать MEX-функцию C++, откройте исходный файл arrayProduct.cpp и сохраните его на вашем пути MATLAB. Создайте MEX-функцию C++ с помощью инструкций в этой теме, Сборка Программы C++ MEX.

Следующая команда создает файл MEX с корневым именем arrayProductMEX и помещает его в папку с функцией обертки, которая принята, чтобы быть MyPathFolder в этом примере. Команда mex создает папку, если это не существует.

mex -output arrayProductMEX -outdir MyPathFolder arrayProduct.cpp

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

result = arrayProduct(2,[1 2 3 4]);
result
result =

     2     4     6     8

Следующий код вызывает MEX-функцию C++ в цикле for. Первый вызов arrayProduct создает хост-процесс MEX. Последующие вызовы используют тот же процесс, если процесс не уничтожается, например, катастрофический отказ MEX-функции C++.

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++ к MEX-функции C++ и установить точки останова отлаживать программу. Вот шаги, чтобы настроить и отладить MEX-функцию C++ из процесса.

  • Создайте исходный код C++ MEX с помощью команды mex с опцией -g, чтобы включать отладочную информацию.

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

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

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

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

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

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

Отладка Используя Microsoft Visual Studio

  1. Гарантируйте, что Визуальный 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 Debug выберите Attach to Process.

    В диалоговом окне Attach to Process выберите процесс MATLABMexHost и нажмите Attach.

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

  7. Откройте свой исходный файл C++ MEX путем нажатия на File> Open> File и выбора файла.

  8. Установите точку останова путем щелчка правой кнопкой по желаемой строке кода и нажатия на Breakpoint> Insert Breakpoint в контекстном меню.

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

    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 с именем файла MEX C++ и идентификатором процесса, который вы получили из объекта хоста MEX в MATLAB:

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

    break myMexFunction.cpp:21
  6. Из MATLAB, выполнение MEX-функция C++ из процесса с помощью метода feval matlab.mex.MexHost.

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

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

  7. От терминала Linux используйте функции, обеспеченные отладчиком, чтобы отладить ваш исходный код.

Отладка на Macintosh Systems

В системах 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, выполнение MEX-функция C++ из процесса с помощью метода feval matlab.mex.MexHost.

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

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

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

  8. От macOS Терминала используйте функции, обеспеченные отладчиком, чтобы отладить ваш исходный код.

Смотрите также

|

Похожие темы