Как избежать повторной инициализации .mex (скомпилированный код Matlab)? - PullRequest
4 голосов
/ 11 сентября 2011

У меня есть код Matlab, который вызывает MEX, сгенерированный из кода C ++.Код C ++ требует интенсивного выделения памяти и вычислений при инициализации.Используя статический указатель, инициализация выполняется только при первом вызове, а указатель читается при последующих вызовах.

Все работало очень хорошо, пока этот код Matlab не был скомпилирован с использованием Matlab Compiler.Теперь последующие вызовы MEX (теперь это происходит в скомпилированном коде Matlab) заканчиваются сбоем, потому что статический указатель явно ссылается на неверную память.

Что можно сделать, чтобы избежать дублирующейся инициализации в этом случае?

Спасибо, Лев

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Отличный вопрос. Возможно, вам придется разбить это на две разные mex-функции: одну, которая вычисляет инициализацию и возвращает ее результаты, и другую, которая выполняет вашу функцию.

  [heavyCompResults,otherHeavyResults] = initComputation(initParams);

Тогда:

  performComputation(compParams,heavyCompResults,otherHeavyResults);

С другой стороны, вы могли бы записывать вещи в файл, а не передавать его через Matlab.

  initComputation(initParams,initResultsFname);  %writes initResultsFname

Тогда:

  performComputation(compParams,initResultsFname); %reads initResultsFname

Еще одна альтернатива:

Превратите ваш код в DLL и используйте функцию loadLibrary в Matlab . Таким образом, когда вы создаете статический объект, он, вероятно, должен оставаться в памяти между вызовами. Но я не проверял это.

0 голосов
/ 24 июня 2012

Я не уверен, что вы уже решили свою проблему или нет, но вот некоторая соответствующая информация, которая помогла мне.

Это похоже на проблему, с которой я столкнулся.При компиляции новой версии той же функции (в которой были проблемы с доступом к памяти) я обнаружил, что старая версия функции mex фактически не покидала память.Я перепробовал множество вещей, включая (предположительно) очистку функции mex из памяти matlab, используя clear mex-file-name .Единственный успешный способ предотвратить повторный доступ к той же самой некорректной функции mex, которую я нашел, - перезапустить matlab.Это исправило проблему с памятью каждый раз.Хотя этот случай и решение не точно соответствуют вашей проблеме, я предлагаю попробовать перезапустить matlab.Надеюсь, это поможет.

...