MATLAB 컴파일러를 사용할 때 상당한 속도를 보이지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/137011

문제

나는 너무 느리게 실행되는 멋진 Matlab 코드를 많이 가지고 있으며 C에 글을 쓰는 데 고통이 될 것입니다. C의 Matlab 컴파일러는 전혀 도움이되지 않는 것 같습니다. 더 많은 실행 속도를 높여야합니까? 내가 망쳐 졌어?

도움이 되었습니까?

해결책

나는 DWJ의 말을 반향 할 것이다 : Matlab 코드가 느리면, 아마도 충분히 벡터화되지 않았기 때문일 것이다. 전체 배열에서 작업을 수행 할 때 명백한 루프를하고 있다면 범인입니다.

이것은 모든 배열 지향적 동적 언어 (Perl 데이터 언어, 숫자 파이썬, Matlab/Octave 등)에 동일하게 적용됩니다. 컴파일 된 C 및 Fortran 컴파일 코드의 어느 정도는 사실입니다. 특수 디자인 된 벡터화 라이브러리는 일반적으로 신중하게 손으로 코딩 된 내부를 사용합니다. 루프 및 SIMD 지침 (예 : MMX, SSE, Altivec).

다른 팁

당신이 사용하는 경우 MATLAB CAMPIER (최근 버전의 Matlab에서) 그러면 속도가 전혀 보이지 않을 것입니다. 이는 실제로 모든 컴파일러가 코드를 포장하여 Matlab이없는 사람들에게 배포 할 수 있도록 코드를 포장하는 방법을 제공하기 때문입니다. 더 빠른 것으로 변환하지 않습니다 (예 : 기계 코드 또는 C와 같은) - 단지 C로 래핑하므로 호출 할 수 있습니다.

본질적으로 MATLAB Computational Kernel 인 MATLAB 컴파일러 런타임 (MCR)에서 코드를 실행하여 코드가 여전히 해석되고 있습니다. MCR을 호출하여 발생하는 페널티 덕분에 MATLAB에서 단순히 실행 한 것보다 컴파일 된 코드가 더 느리게 실행된다는 것을 알 수 있습니다.

다른 방법으로 - 컴파일러가 실제로 컴파일하지 않는다고 말할 수 있습니다. 최소한 단어의 전통적인 의미에서.

더 오래된 버전의 컴파일러는 다르게 작동하며 특정 상황에서는 속도를 높일 수 있습니다. Mathwork의 테이크를 위해이 점이 있습니다

http://www.mathworks.com/support/solutions/data/1-1arns.html

내 경험에서 느린 MATLAB 코드는 일반적으로 코드를 벡터화하지 않는 것 (예 : 배열을 곱하는 대신 루프를 쓰기)에서 비롯됩니다 (간단한 예제).

파일 I/O를 수행하는 경우 한 번에 한 조각으로 데이터를 읽는 것을 찾으십시오. FSCANF의 벡터화 된 버전에 대한 도움말 파일을 찾으십시오.

Matlab에도 프로파일 러가 포함되어 있다는 것을 잊지 마십시오!

먼저, 나는 프로파일 링 및 벡터화에 대한 위의 모든 의견을 두 번째합니다.

역사적 관점에서 ...

이전 버전의 MATLAB을 사용하면 M 코드를 미리 준비하고 MATLAB 라이브러리 통화 세트로 변환하여 M 파일을 MEX 기능으로 변환 할 수있었습니다. 이 호출은 통역사가 한 모든 오류를 확인했지만 이전 버전의 통역사 및/또는 온라인 파서가 느려서 M 파일을 컴파일하는 데 도움이됩니다. MATLAB이 C에서 그 중 일부를 인화하기에 충분히 똑똑했기 때문에 루프가있을 때 일반적으로 도움이되었습니다. MATLAB 버전 중 하나가 있다면 MEX 스크립트에 .C 파일을 저장하기 위해 말할 수 있으며 그것이 무엇인지 정확히 알 수 있습니다. 행위.

보다 최근 버전 (아마도 2006a 이상이지만 기억하지 못)에서 Mathworks는 통역사를위한 정시 컴파일러를 사용하기 시작했습니다. 실제로이 JIT 컴파일러는 모든 MEX 기능을 자동으로 컴파일하므로 오프라인으로 명시 적으로 수행하는 것이 전혀 도움이되지 않습니다. 그 이후 각 버전에서 그들은 또한 통역사를 훨씬 더 빨리 만들기 위해 많은 노력을 기울였습니다. 최신 버전의 MATLAB은 MEX 파일에 M 파일을 자동으로 컴파일 할 수 없다고 생각합니다.

MATLAB 컴파일러는 M 코드를 마무리하여 MATLAB 런타임으로 발송합니다. 따라서 Matlab에서 볼 수있는 성능은 컴파일러에서 볼 수있는 성능이어야합니다.

다른 답변에 따라 코드를 벡터화하는 것이 도움이됩니다. 그러나 Matlab Jit은 요즘 꽤 좋으며 많은 것들이 거의 벡터화되거나 벡터화되지 않은 것입니다. 그것은 벡터화로부터 얻을 수있는 성능 이점이 없다고 말할 수는 없으며, 한때 마법의 총알이 아닙니다. 실제로 말할 수있는 유일한 방법은 프로파일 러를 사용하여 코드가 병목 현상을 보는 위치를 찾는 것입니다. 종종 코드의 성능을 향상시키기 위해 로컬 리팩토링을 수행 할 수있는 장소가 종종 있습니다.

성능을 발휘할 수있는 몇 가지 다른 하드웨어 접근 방식이 있습니다. 첫째, 선형 대수 서브 시스템의 대부분은 멀티 스레드입니다. 멀티 코어 또는 멀티 프로세서 플랫폼에서 작업하는 경우 선호도에서이를 활성화했는지 확인할 수 있습니다. 둘째, 병렬 컴퓨팅 도구 상자를 사용하여 여러 프로세서를 더 활용할 수 있습니다. 마지막으로 Simulink 사용자 인 경우 EMLMEX를 사용하여 M 코드를 C로 컴파일 할 수 있습니다. 이것은 고정 점 작업에 특히 효과적입니다.

코드 프로파일 링을 시도해 보셨습니까? 실행 시간을 지배하는 함수만으로 모든 코드를 벡터화 할 필요는 없습니다. Matlab Profiler는 코드가 가장 많은 시간을 소비하는 위치에 대한 힌트를 제공합니다.

당신이 읽어야 할 다른 많은 것들이 있습니다. 성능 향상을위한 팁 Mathworks 매뉴얼의 섹션.

MCC는 코드 속도를 전혀 높이지 않습니다. 실제로 컴파일러가 아닙니다.

포기하기 전에 프로파일 러를 실행하고 모든 시간이 어디로 가는지 파악해야합니다 (도구-> 프로파일 링). 또한 "Tic"과 "TOC"를 신중하게 사용하면 도움이 될 수 있습니다. 시간이 어디로 가는지 알 때까지 코드를 최적화하지 마십시오 (추측하지 마십시오).

Matlab에서 :

  • 비트 레벨 작업은 정말 느립니다
  • 파일 I/O는 느립니다
  • 루프는 일반적으로 느리지 만 벡터화는 빠릅니다 (벡터 구문을 모르는 경우 배우십시오).
  • 핵심 작업은 실제로 빠릅니다 (예 : 매트릭스 곱하기, FFT)
  • c/fortran/etc에서 더 빨리 무언가를 할 수 있다고 생각되면 Mex 파일을 쓸 수 있습니다.
  • Matlab을 C (Google "Matlab to C")로 변환하는 상용 솔루션이 있으며 작동합니다.

코드를 "임베디드 MATLAB"로 포트 한 다음 RealTime-Workshop을 사용하여 C로 변환 할 수 있습니다.

내장 된 MATLAB은 MATLAB의 서브 세트입니다. 셀 어레이, 그래픽, 동적 크기의 해수 또는 일부 매트릭스 주소 지정 모드를 지원하지 않습니다. 임베디드 MATLAB에 포트하는 데 상당한 노력이 필요할 수 있습니다.

Realtime-Workshop은 코드 생성 제품의 핵심입니다. 일반적인 C를 뱉어 내거나 다양한 임베디드 플랫폼에 최적화 할 수 있습니다. 당신에게 가장 많이 간섭하는 것은 아마도 XPC- 표적 일 것입니다. 이것은 범용 하드웨어를 임베디드 대상으로 취급합니다.

프로파일 링에 투표 한 다음 병목 현상이 무엇인지 살펴 봅니다.

병목 현상이 매트릭스 수학이라면 아마도 큰 Gotcha가 배열 할당이라는 것을 제외하고는 더 나은 일을하지 않을 것입니다. 예를 들어 루프가있는 경우 :

s = [];
for i = 1:50000
  s(i) = 3;
end

이것은 어레이를 계속 크기를 조정해야합니다. 배열을 추정하는 것이 훨씬 빠릅니다 (0 또는 Nan으로 시작).

s = zeros(50000,1);
for i = 1:50000
  s(i) = 3;
end

병목 현상이 반복되는 경우 많은 기능 호출을 실행하면 힘든 일입니다.

병목 현상이 Matlab이 신속하게 수행하지 않는 것 (특정 유형의 구문 분석, XML 등)이라면 Matlab이 이미 JVM에서 실행되기 때문에 Java를 사용하고 IT 인터페이스는 실제로 자의적인 JAR 파일로 쉽게 인터페이스합니다. 나는 C/C ++와의 인터페이스를 보았고 정말 추악합니다. Microsoft Com은 괜찮습니다 (Windows에서만) 그러나 Java를 배우고 난 후에는 다시 돌아갈 것이라고 생각하지 않습니다.

다른 사람들이 지적했듯이, 느린 MATLAB 코드는 종종 벡터화 불충분 한 결과입니다.

그러나 때로는 완벽하게 벡터화 된 코드조차도 느립니다. 그런 다음 몇 가지 옵션이 더 있습니다.

  1. 사용할 수있는 라이브러리 / 도구 상자가 있는지 확인하십시오. 이것들은 일반적으로 매우 최적화되도록 작성되었습니다.
  2. 코드를 프로필하고, 단단한 지점을 찾고, 일반 C로 다시 작성하십시오. C 코드를 MATLAB에 연결하는 것은 쉽고 문서에서 다루어집니다.

Matlab Compiler에 의해 당신은 아마도 MATLAB 통역사를 우회하여 코드를 약간 속도로 만드는 명령 MCC를 의미 할 것입니다. MATLAB 코드의 속도가 크게 (50-200 인) Mex 명령에 의해 컴파일 된 실제 C 코드를 사용하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top