Mex функция вызывается из Matlab и числовой разницы

0

У меня есть научный код Matlab, и я хочу точно сравнить результат из кода Matlab, содержащий вызов функции invv (pin) (inval) Matlab для вывода того же кода Matlab, вызывающего теперь реализацию C++ pinv().

Я использую код Matlab, чтобы вызывать pinv C++ вместо Matlab pinv(): я компилирую pinV C++ в файл mex, используя соответствующий API.

Может ли вызов функции, скомпилированной в файл mex, ввести некоторую численную разницу в верхней части разницы в реализации между Matlab и C++ pinv()?

  • 0
    Возможно, я не правильно понимаю вопрос, но не могли бы вы запустить коды и проверить результаты? Кроме того, я хотел бы верить, что, пока оба кода выполняются на одной машине, не должно быть добавленных различий помимо уже существующих различий в C ++ и Matlab.
  • 1
    Нет, у MEX нет побочных эффектов. Это просто еще одна оболочка C ++. Внутри mxArray есть только буфер. Это непрозрачный тип, но он хранит старые данные где-то внутри. Данные не будут изменены, если вы не измените их путем преобразования либо ввода, либо вывода в MATLAB .
Теги:
floating-point
precision
mex

1 ответ

1
Лучший ответ

Все матричные операции, выполняемые MATLAB, реализуются библиотекой LAPACK, поэтому да, могут быть различия, вызванные реализацией. Если то, что вы спрашиваете, "использует ли библиотека LAPACK разные аппаратные функции с плавающей запятой, чем компилируемый код C++", что маловероятно, если компилятору C++ не предписывается генерировать код, предназначенный для конкретной платформы HW, подмножества доступных.

Однако, даже если коды аналогичны на уровне источника, LAPACK скомпилирован из исходного кода FORTRAN, в то время как пользовательская подпрограмма выводится из C++; оптимизация, выполняемая разными компиляторами, различна. Таким образом, существует высокая вероятность того, что - даже с поразительно похожим исходным кодом - получившийся исполняемый код будет другим. Это может привести к разным результатам.

Примечание: манипуляция данными (т.е. Путь передается функции) не изменяет содержание данных; это может быть вопрос времени выполнения, а не числового отклонения. MEX - это, в основном, соглашение о том, как собственные структуры данных MATLAB представляются любой рутине, обрабатывающей их; эффективность рутинного доступа к данным снова является вопросом реализации.

Дальнейшее замечание: нужно сказать, что формат FORTRAN в памяти 2D-данных является первым в столбце, тогда как C-и-семейная компоновка 2D-данных в памяти является первой строкой (я говорю об индексировании). Это также может вызывать различия во времени выполнения (как и в коде exec), в зависимости от того, как алгоритм реализации обращается к данным, поскольку производительность современных HW- систем сильно зависит от, например, количества промахов в кэше.

  • 0
    я скорее спрашивал о накладных расходах, принесенных мексами

Ещё вопросы

Сообщество Overcoder
Наверх
Меню