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

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

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

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

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

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

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

Примечание

Размер переменных передал между C++, и MATLAB ограничивается 2 Гбайт, когда вы вызываете функцию 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-функция из процесса

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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++ из процесса с помощью matlab.mex.MexHost feval метод.

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

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

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

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

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

|

Похожие темы