Непроцессное выполнение 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

Перестройка MEX-функции C++

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

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

Отладка непроцессных 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, нажав File > Open > File и выбрав файл.

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

  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 с именем файла MEX на C++ и идентификатором процесса, который вы получили от объекта хоста 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. <reservedrangesplaceholder1> <reservedrangesplaceholder0> или continue с терминала macOS. Выполнение программы останавливается в точках останова.

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

См. также

|

Похожие темы