После месяца переписки по электронной почте с моими контактами в Mathworks, игры с моим собственным кодом и профилирования моего кода в любом случае, у меня есть ответ;тем не менее, это может быть самый неудовлетворительный ответ, который у меня когда-либо был на технический вопрос:
Короткая версия: «Обновление до версии Matlab 2011a (официально выпущенной на прошлой неделе), эта проблема теперь решена».
Более длинная версия связана с проблемой издержек, связанных со шлюзом mex в версиях 2010b и более ранних.Лучшее объяснение, которое я смог извлечь, состоит в том, что эти издержки не оцениваются один раз, мы платим немного каждый раз, когда функция вызывает другую функцию, которая находится в связанной библиотеке.
Хотя почему это происходитсбивает с толку, это по крайней мере согласуется с профилированием АКУЛЫ, которое я сделал.Когда я профилирую и сравниваю различия между нативным и мекс-приложением, возникает повторяющаяся картина.Время, потраченное на функции из исходного кода, который я написал для приложения, не меняется.Время, затрачиваемое на библиотечные функции, немного увеличивается при сравнении нативных и мексиканских реализаций.Функции в другой библиотеке, используемые для создания этой библиотеки, значительно увеличивают разницу.Разница во времени продолжает увеличиваться по мере того, как мы продвигаемся все глубже, пока не достигнем реализации BLAS.
Несколько часто используемых функций BLAS были основными виновниками.Функция, которая занимала ~ 1% моего времени вычислений в нативном приложении, работала на 30% в функции mex.
Реализация шлюза mex, по-видимому, изменилась между 2010b и 2011a.На моем macbook нативное приложение занимает около 6 секунд, а версия mex - 6,5 секунды.Это накладные расходы, с которыми я могу справиться.
Что касается основной причины, я могу только строить догадки.Matlab имеет свои корни в интерпретирующем кодировании.Поскольку мекс-функции являются динамическими библиотеками, я предполагаю, что каждая мекс-библиотека не знала, с чем она была связана, до времени выполнения.Поскольку Matlab предлагает пользователю редко использовать mex, а затем только для небольших вычислительных блоков, я предполагаю, что большие программы (такие как решатель ODE) реализуются редко.Эти программы, как и моя, страдают больше всего.
Я профилировал несколько функций Matlab, которые, как я знаю, были реализованы в C, затем скомпилирован с использованием mex (особенно sbiosimulate после вызова sbioaccelerate в кинетических моделях)., часть набора инструментов SimBiology), и, похоже, есть некоторые существенные ускорения.Таким образом, обновление 2011a представляется более полезным, чем обычное полугодовое обновление.
Удачи другим программистам с аналогичными проблемами.Спасибо за все полезные советы, которые помогли мне начать в правильном направлении.
- Андрей