2014-10-20 2 views
6

MATLAB Engine API을 사용하여 MATLAB을 C/C++와 인터페이스합니다. 내 특별한 경우 MATLAB에서 Matlab 엔진 호출 속도 향상

뭔가를 계산하는 데 사용되며, 결과는 양쪽에 다양한 테스트를 통해, 그러나 C.에 인쇄되어 내가 여기

C.

에 상당한 성능 손실을 눈치 MATLAB 함수 호출의 예입니다 :

는 C 측면에서
tic; 
data = predictIM(data); 
toc; 

다음과 같이 나는 유사한 기능을 호출

iMod::Timer_T<high_resolution_clock> t; 

engPutVariable(ep, "data", dataContent); 
engEvalString(ep, "[posture] = predictIM(data);"); 

UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds()); 

++ C에서 내 타이머 구현으로 보인다 다음과

template< class Clock > 
class Timer_T 
{ 
    typename Clock::time_point start; 
    public: 
     Timer_T() : start(Clock::now()) {} 
     typename Clock::duration elapsed() const { 
     return Clock::now() - start; 
     } 
     double seconds() const { 
     return elapsed().count() * 
      ((double)Clock::period::num/Clock::period::den); 
     } 
}; 

MATLAB 상기 코드는 24 FPS의 C 코드 반면, 대략 매트릭스 (data)를 설정 포함한 초당 180 개 프레임을 실행. 나는 내 자신의 타이머 구현이 C/C++ 측에서 사용되는 반면 MATLAB에서 실행 시간을 측정하기 위해 tic/toc을 사용했다.

응용 프로그램을 프로파일 링하는 동안 MATLAB 엔진 호출이 병목 현상을 발견했습니다. Linux MATLAB 엔진 구현은 MATLAB과 인터페이스하기 위해 명명 된 파이프를 사용하고 있으며 엔진이있는 MATLAB 통신 속도를 높이는 방법이 있는지 궁금합니다.

+0

그건 C가 아니에요. C++입니다. –

+0

참. 명확하지 않은 것에 대해 유감스럽게 생각합니다. 나는 C로 Matlab 엔진을 구현하고 C++에서 타이밍을 계산한다. (어디에서 Matlab 결과를 더 많이 사용하는지) – Dave

+1

@Dave : 나는 당신이 할 수있는 것이 아무것도 없다고 생각한다. 엔진 API는 모든 데이터 때문에 오버 헤드를 추가하는 또 다른 계층이다. marshaling back and forth ... 당신이 MATLAB에 한 번 연결되면 각 계산에 대해 열린 연결을 재사용한다고 가정합니다. 반복적으로 MATLAB 프로세스에 대한 열기 및 닫기 연결이 느려질 수 있습니다. – Amro

답변

1

먼저 MATLAB 엔진을 측정하는 것은 불공평합니다. 당신은 시간이처럼 MATLAB에서했던 것처럼 계산 시간은해야합니다

engPutVariable(ep, "data", dataContent);    // you should not time this 

iMod::Timer_T<high_resolution_clock> t; 
engEvalString(ep, "[posture] = predictIM(data);");  // time this only for fair 
UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds()); 

사실, 내 경험, MATLAB을 실행하고 비슷한 속도를 가지고 있어야 C/C++에서의 엔진을 호출하는 그들은 실제로 의존으로 MATLAB 소프트웨어 자체.

둘째, 가능한 속도 향상에 대한 조언이 있습니다. 각 호출마다 하나씩 작성하는 대신 C/C++ 프로젝트 전체에서 단일 MATLAB 엔진 만 열어야합니다. 이와 같이 :

int main() 
{ 
    // Open MATLAB engine for the whole project 
    Engine *ep = engOpen(NULL); 

    // Use it multiple times 
    for (int i=0; i<100; ++i){ 
     engEvalString(ep, ...); 
    } 

    // Close MATLAB engine 
    engClose(ep); 

    return 0; 
} 
+1

실행 시간을 상당히 늦추기 때문에 변수를 Matlab 작업 공간에 밀어 넣기위한 시간을 포함 시켰습니다. 필자의 특별한 경우에는 3x16 행렬을 사용하는 동안 15ms가 걸리고 결과 계산에는 28ms가 걸립니다. 결과를 검색하는 데 또 20ms가 소요됩니다. 따라서 매트릭스를 설정/가져 오는 시간을 측정하는 것이 전반적인 성능에 중요해 보입니다. 내 구현에서는 오직 한 번만 Matlab 엔진을 사용했다. – Dave