2012-04-17 3 views
2

В настоящее время выполняется повторение эксперимента, в котором используются файлы MEX в MATLAB 2012a, и время от времени сталкиваются с ошибками сегментации, которые я не могу понять.Дефекты сегментации при запуске файлов MEX в параллельном режиме

Некоторая информация о недостатках

  • Они встречаются случайно

  • Они возникают только тогда, когда я бегу несколько повторений моего эксперимента параллельно на машине Linux с использованием цикла parfor.

  • Они делают не происходят, когда я выполняю несколько повторений своего эксперимента параллельно на Mac OSX 10.7 с использованием парфорирования.

  • Они делают не происходят, когда я запускаю или происходят, когда я запускаю повторения последовательно.

  • Они, похоже, встречаются гораздо реже, когда я провожу 2 эксперимента параллельно - в отличие от 12 экспериментов параллельно.

Некоторая информация о моей MEX файла:

  • Он написан на C

  • Он использует IBM CPLEX 12.4 API (это потокобезопасно)

  • Он был составлен с использованием GCC 4.6.3

Мои мысли, что может возникнуть проблема с доступом к файлу MEX в нескольких ядрах. Может ли кто-нибудь пролить свет на то, что может произойти, или предложить исправить? Я был бы рад предоставить дополнительную информацию по мере необходимости.

ответ

2

Недавно я отправил трассировку стека для людей в MATLAB, и выяснилось, что виновником является не мой код, а одна из функций из CPLEX 12.4 API. Оказывается, эта функция использует функцию putenv() в C, которая не обязательно является потокобезопасной.

К сожалению, я должен продолжать использовать эту функцию и API, поэтому я разместил follow-up thread that focuses on finding ways to avoid this fault.

Любые советы будут оценены.

1

Мои мысли, что может возникнуть проблема с доступом к файлу MEX в нескольких ядрах.

Скорее всего, ваш файл MEX имеет ошибку. Различные ошибки (которые очень легко сделать на C), такие как доступ к оборванной памяти, double-free() ing или запись за конец выделенного массива, вызовут прерывистый SIGSEGV.

Ваш лучший выбор - запустить Matlab под отладчиком и посмотреть , где сбой.

Смежные вопросы