2014-10-16 1 views
0

저는 Matlab 과학 코드가 있습니다. 동일한 Matlab 코드 호출 출력에 반전 함수 pinv() (기본 Matlab) 호출이 포함 된 Matlab 코드의 출력을 정확하게 비교하고 싶습니다. 이제 pinv()의 C++ 구현.Mex 함수가 Matlab에서 호출하여 수치 차이가 발생했습니다.

Matlab pinv() 대신 C++ pinv를 호출하는 데 Matlab 코드를 사용합니다. 관련 API를 사용하여 C++ pinv를 mex 파일로 컴파일합니다.

mex 파일로 컴파일 된 함수를 호출하면 Matlab과 C++ pinv() 사이의 구현 차이점에 몇 가지 차이점이 생길 수 있습니까?

+0

질문을 제대로 이해하지 못했지만 코드를 실행하고 결과를 확인할 수 없습니까? 그 외에도 두 코드가 동일한 시스템에서 실행되는 한 C++과 Matlab의 기존 차이점을 제외하고는 차이점이 없어야합니다. –

+1

아니요, MEX 관련 부작용은 없습니다. 그것은 또 다른 C++ 래퍼입니다. 'mxArray' 안에 그냥 버퍼가 있습니다. 그것은 불투명 한 유형이지만, 보통 오래된 데이터를 어딘가에 저장하고 있습니다. MATLAB_에서 입력 또는 출력을 변환하여 수정하지 않으면 데이터가 수정되지 않습니다. – chappjc

답변

1

MATLAB에서 실행되는 모든 행렬 연산은 LAPACK 라이브러리에 의해 구현되므로 예를 들어 구현시 차이가 발생할 수 있습니다. 당신이 요구하는 것이 이라면 "LAPACK 라이브러리는 C++ 컴파일 된 코드보다 다른 하드웨어 부동 소수점 기능을 사용합니까", 그럴 가능성이 매우 낮습니다 — C++ 컴파일러가 해당 하드웨어를 부분 집합하는 특정 HW 플랫폼을 대상으로하는 코드를 생성하도록 지시하지 않는 한 사용 가능한 하나.

그러나 코드가 원본 수준에서 유사하더라도 LAPACK은 FORTRAN 소스 코드에서 컴파일되는 반면 사용자 지정 루틴은 C++에서 생성됩니다. 다른 컴파일러에 의해 수행 된 최적화는 다릅니다. 따라서 놀랍게도 유사한 소스 코드과 함께 - 결과로 실행 코드이 다를 가능성이 큽니다. 결과가 달라질 수 있습니다.

참고 : 데이터 조작 (즉, 함수로 전달되는 방식)으로 데이터 내용이 변경되지 않습니다. 그것은 숫자 편차가 아니라 실행 시간의 문제 일 수 있습니다. MEX는 기본적으로 네이티브 MATLAB 데이터 구조가 루틴을 처리하는 방식에 따라 표시되는 규칙입니다. 데이터를 액세스하는 루틴의 효율성은 다시 구현의 문제입니다.

또한 코멘트 :이 하나는 2D 데이터의 C-및 가족 메모리 레이아웃은 첫 번째 행 동안 2D 데이터의 FORTRAN 메모리 레이아웃, 열 처음으로 말해야한다 (나는 색인에 대해서 이야기하고). 또한 현대의 HW 아키텍쳐의 성능이 예를 들어, 실행 속도에 크게 의존하기 때문에 구현 알고리즘 accesses the data이 어떻게 수행되는지에 따라 실행 시간의 차이를 유발할 수있다. 얼마나 많은 캐시 누락이 발생하는지.

+0

나는 mex 물건에 의해 가져 오는 오버 헤드에 대해 오히려 묻고 있었다. – octoback

관련 문제