programing

퍼포먼스 트레이드오프 - MATLAB가 C/C++보다 우수하거나 느린 경우

projobs 2022. 8. 13. 11:49
반응형

퍼포먼스 트레이드오프 - MATLAB가 C/C++보다 우수하거나 느린 경우

C/C++는 하위 레벨의 언어이며 다른 상위 레벨의 언어와 비교할 때 상대적으로 최적화된 머신 코드를 생성한다는 것을 알고 있습니다.하지만 나는 그것보다 훨씬 더 많은 것이 있다고 생각한다. 그것은 또한 관행에서 명백하다.

가우스 샘플 수집의 몬테카를로 평균화 등의 간단한 계산을 하면 C++ 구현과 MATLAB 구현 사이에 큰 차이가 없다는 것을 알 수 있습니다.실제로 MATLAB의 성능이 다소 향상되는 경우도 있습니다.

수천 줄의 코드를 사용한 대규모 시뮬레이션으로 넘어가면 실제 그림이 서서히 나타납니다.C++ 시뮬레이션을 통해 동등한 MATLAB 구현보다 시간 복잡도가 100배 이상 향상되는 우수한 성능을 확인할 수 있습니다.

대부분의 경우 C++의 코드는 거의 시리얼이며 하이파이 최적화는 명시적으로 이루어지지 않습니다.반면 MATLAB은 본질적으로 많은 최적화를 수행합니다.예를 들어, 대량의 랜덤 샘플의 청크를 생성하려고 하면, IT++/GSL/Boost와 같은 라이브러리를 사용하는 C++에서는, 비교적 동작이 느려집니다(사용하는 알고리즘은 mt1937과 동일).

MATLAB/C++의 퍼포먼스에 있어서, 보다 심플한 트레이드 오프가 있는지 어떤지를 알기 위해서입니다."할 수 있을 때마다 C/C++가 더 좋다"(자주 경험자)는 말처럼?다른 관점에서 보면, "편안함 외에 MATLAB의 장점은 무엇입니까?"

덧붙여서, 부호화 효율 파라미터는 여기서 중요하지 않다고 생각합니다.두 경우 모두 같은 프로그래머를 생각할 수 있습니다.그리고 python, R과 같은 다른 대안들은 여기서 관련이 없다고 생각합니다.그러나 우리가 사용하는 특정 라이브러리에 대한 의존도는 흥미로울 것입니다.

[통신 시스템 부호화 이론 박사과정 학생입니다]저는 항상 matlab/C++를 사용하여 시뮬레이션을 하고 있으며, 두 경우 모두 몇 개의 10,000개의 라인을 코딩한 경험이 있습니다.

저는 Matlab과 C++를 10년 정도 사용하고 있습니다.저는 연구를 위해 구현된 모든 수치 알고리즘에 대해 항상 Matlab을 사용한 프로토타이핑에서 시작하여 프로젝트를 C++로 변환하여 10배에서 100배(진짜)의 성능을 향상시킵니다.물론 최적화된 C++ 코드와 완전히 벡터화된 Matlab 코드를 비교하고 있습니다.평균 50배 정도 향상되었습니다.

이 두 프로그래밍 언어에는 많은 미묘함이 있으며, 다음과 같은 오해가 있습니다.

  1. Matlab은 스크립트 언어이지만 C++는 컴파일되어 있습니다.

    Matlab은 J를 사용합니다.IT 컴파일러는 스크립트를 머신 코드로 변환하기 위해 Matlab이 제공하는 컴파일러를 사용하여 최대 1.5~2배 속도를 향상시킬 수 있습니다.

  2. Matlab 코드는 완전히 벡터화할 수 있지만 C++에서 직접 코드를 최적화해야 합니다.

    완전히 벡터화된 Matlab 코드는 C++/C/Assembly로 작성된 라이브러리를 호출할 수 있습니다(예: Intel MKL).그러나 플레인 C++ 코드는 최신 컴파일러에 의해 합리적으로 벡터화할 수 있습니다.

  3. Matlab이 제공하는 툴박스와 루틴은 매우 잘 조정되어야 하며 합리적인 성능을 가져야 합니다.

    아니요. 선형 대수 루틴을 제외하면 일반적으로 성능이 좋지 않습니다.

벡터화된 Matlab 코드와 비교하여 C++에서 10~100배의 성능을 얻을 수 있는 이유는 다음과 같습니다.

  1. Matlab에서 외부 라이브러리(MKL)를 호출하려면 시간이 걸립니다.

  2. Matlab의 메모리는 동적으로 할당되어 해방됩니다.예를 들어, 작은 행렬 곱셈:
    A = B*C + D*E + F*G
    에서는 Matlab이 2개의 임시 행렬을 생성해야 합니다.C++에서는 메모리를 사전에 할당하면 NONE이 생성됩니다.이제 그 문장을 1000번 반복한다고 상상해보세요.C++의 다른 솔루션은 C++11 Rvalue 참조로 제공됩니다.이것은 C++의 가장 큰 개선점 중 하나이며, 이제 C++ 코드는 일반 C 코드만큼 빠릅니다.

  3. 병렬 처리를 수행하려는 경우 Matlab 모형은 다중 공정이고 C++ 방법은 다중 스레드입니다.병렬화할 필요가 있는 작은 태스크가 많은 경우 C++는 여러 스레드까지 선형 이득을 제공하지만 Matlab에서는 성능이 저하될 수 있습니다.

  4. C++에서의 벡터화에는 내장 함수/어셈블리를 사용하는 것이 포함되며, 경우에 따라서는 SIMD 벡터화가 C++에서만 가능합니다.

  5. C++에서는 숙련된 프로그래머가 L2 캐시 미스나 L1 캐시 미스도 완전히 회피할 수 있기 때문에 CPU는 이론적인 throughput 제한에 도달합니다.매트랩은 이 이유만으로 성능이 C++보다 10배 이상 뒤처질 수 있다.

  6. C++에서는 계산 부하가 높은 명령어는 지연 시간(어셈블리 또는 내장 기능으로 신중하게 코드)과 의존성(대부분은 컴파일러 또는 CPU 하드웨어에 의해 자동으로 처리됨)에 따라 그룹화될 수 있습니다.따라서 이론적인 IPC(클럭 사이클당 명령)에 도달하여 CPU 파이프라인이 채워집니다.

단, C++에서의 개발 시간도 Matlab에 비해 10배!

C++ 대신 Matlab을 사용해야 하는 이유:

  1. 데이터 시각화C++ 없이도 제 커리어를 계속할 수 있다고 생각하지만, 아름다운 플롯을 만들어 낼 수 있기 때문에 매트랩 없이는 살 수 없습니다!

  2. 효율은 낮지만 수학적으로 견고한 내장 루틴 및 도구 상자.먼저 정답을 맞힌 후 효율성에 대해 이야기하십시오.사람들은 C++에서 미묘한 실수(예를 들어 암묵적으로 더블을 int로 변환)를 하여 올바른 결과를 얻을 수 있다.

  3. 아이디어를 표현하고 코드를 동료에게 제시합니다.Matlab 코드는 C++보다 읽기 쉽고 훨씬 짧으며 컴파일러 없이도 올바르게 실행할 수 있습니다.나는 다른 사람의 C++ 코드를 읽는 것을 거부한다.코드 품질이 보장되지 않기 때문에 C++ GNU 과학 라이브러리도 사용하지 않습니다.연구자/엔지니어가 C++ 라이브러리를 블랙박스로 사용하여 정확성을 당연시하는 것은 위험합니다.상용 C/C++ 라이브러리에서도 지난해 인텔 컴파일러의 sin() 함수에 부호 오류가 있었고 MKL에서도 수치 정밀도 문제가 발생했던 것으로 기억합니다.

  4. 인터랙티브 콘솔과 워크스페이스를 사용한 Matlab 스크립트의 디버깅은 C++ 디버거보다 훨씬 효율적입니다.Matlab에서 인덱스 계산 버그를 찾는 것은 몇 분 안에 완료될 수 있지만, C++에서는 속도를 위해 경계 검사를 제거하면 프로그램이 랜덤으로 충돌하는 이유를 알아내는 데 몇 시간이 걸릴 수 있습니다.

마지막이지만 중요한 것은:

Matlab 코드가 벡터화되면 프로그래머가 최적화할 수 있는 것이 별로 없기 때문에 Matlab 코드 성능은 C++ 코드에 비해 코드의 품질에 훨씬 덜 민감합니다.따라서 Matlab에서 연산 알고리즘을 최적화하는 것이 가장 좋으며, 약간 더 나은 알고리즘은 일반적으로 Matlab에서 약간 더 나은 성능을 가진다.한편, C++에서의 알고리즘 테스트에서는, 어느 정도 같은 방법으로 최적화된 알고리즘을 기술해, 컴파일러가 알고리즘을 다른 방법으로 최적화하지 않는 것을 확인할 필요가 있습니다.

C++ 및 Matlab에서의 최근 경험:

저는 작년에 여러 개의 대형 Matlab 데이터 분석 툴을 만들었는데 Matlab의 느린 속도 때문에 어려움을 겪었습니다.하지만 다음과 같은 기술을 통해 Matlab 프로그램 속도를 10배 향상시킬 수 있었습니다.

  • Matlab 스크립트를 실행/프로파일하고 C/C++에서 중요한 루틴을 재실장하고 MEX를 사용하여 컴파일합니다.중요한 루틴은 논리적으로 단순하지만 수치적으로 많은 경우가 대부분입니다.이것은 속도를 5배 향상시킨다.

  • 모든 불필요한 안전 점검 및 출력 매개 변수 계산에 주석을 달아 Matlab 도구 상자와 함께 제공되는 ".m" 파일을 단순화할 수 있습니다.수정된 코드는 나머지 사용자 스크립트와 함께 배포할 수 없습니다.이것에 의해, 속도가 2배 향상됩니다(C/C++ 및 MEX 이후).

개선된 코드는 Matlab에서 ~98%, C++에서 ~2%입니다.

툴 전체를 C++로 코드화하면 2배(합계 20배)의 속도 향상이 가능하다고 생각합니다만, 이것은 연산 루틴의 100배까지의 속도 향상이 됩니다.하드 드라이브 I/O가 프로그램 실행 시간을 지배합니다.

Mathworks 엔지니어 대상 질문:

Matlab 코드가 완전히 벡터화되면 성능 제한 요소 중 하나가 매트릭스 인덱싱 작업입니다.예를 들어 5000x5000의 매트릭스A에 대해 유한 차분 연산을 실행해야 합니다.

B = A(:,2:end)-A(:,1:end-1)

매트릭스 인덱싱 작업은 Matlab 코드를 C++ 코드보다 몇 배 느리게 만듭니다.매트릭스 인덱싱 성능을 향상시킬 수 있습니까?

지금까지의 경험(양쪽 언어로 컴퓨터 비전과 이미지 처리의 수년에 걸친 경험)으로는 Matlab의 퍼포먼스는 코딩 스타일에 따라 크게 달라지기 때문에 이 질문에 대한 간단한 답은 없습니다.

일반적으로 Matlab은 C++/Fortran 기반 선형 대수 라이브러리를 랩합니다.그래서 어떤 것이라도x = A\b매우 빠를 것입니다.또한 Matlab은 이러한 유형의 문제에 대해 가장 효율적인 해결사를 선택하는 데 매우 적합합니다.x = A\bMatlab은 매트릭스의 크기를 확인하고 적절한 로우 레벨 루틴을 선택합니다.

Matlab은 코드를 "벡터화"하는 경우(예: 회피하는 경우) 대규모 매트릭스의 데이터 조작에도 도움이 됩니다.for loops and use index arrays or boolean arrays to access your data. This stuff is highly optimised.

For other routines, some are written in Matlab code, while others point to a C/C++ implementation (e.g. the Delaunay stuff). You can check this yourself by typing edit some_routine.m. This opens the code and you see whether it is all Matlab or just a wrapper for something compiled.

Matlab, I think, is primarily for comfort - but comfort translates to coding time and ultimately money which is why Matlab is used in the industry. Also, it is easy to learn for engineers from other fields than computer science, with little training in programming.

As a PhD Student too, and a 10years long Matlab user, I'm glad to share my POV:

Matlab is a great tool for developing and prototyping algorithms, especially when dealing with GUIs, high-level analysis (Frequency Domain, LS Optimization etc.): fast coding, powerful syntaxis (think about [],{},: etc.).

As soon as your processing chain is more stable and defined and data dimensions grows move to C/C++.

The main Matlab limit rises when considering its language is script-like: as long as you avoid any cycle (using arrayfun, cellfun or other matrix procedures) performances are high since the called subroutine is again in C/C++.

Your question is difficult to answer. In general C++ is faster, but if make use of the well written algorithms of Matlab it can outperform C++. In some cases Matlab can parallelize your code which has to be done manually in many cases for C++. Mathlab can kind of export C++ code.

So my conclusion is, that you have to measure the performance of both programs to get an answer. But then you compare your two implementations and not Matlab and C++ in general.

Matlab does very well with linear algebra and array/matrix operations, since they seem to have been doing some extra optimizations on the underlying operations - if you want to beat Matlab there, you would need a similarly optimized BLAS/LAPACK library.

As an interpreted language, Matlab loses time whenever a Matlab function is called, due to internal overhead, which traditionally meant that Matlab loops were slow. This has been alleviated somewhat in recent years thanks to significant improvement in the JIT compiler (search for "performance" questions on Matlab on SO for examples). As a consequence of the function call overhead, all Matlab functions that have not been implemented in C/C++ behind the scenes (call edit functionName to see whether it's written in Matlab) risks being slower than a C/C++ counterpart.

Finally, Matlab attempts to be user friendly, and may do "unnecessary" input checking that can take time (due to function call overhead). For example, if you know that ismember gets sorted inputs, you can call ismembc directly (the behind-the-scene compiled function), saving quite a bit of time.

I think you can consider the difference in four folds at least.

  1. Compiled vs Interpreted
  2. Strongly-typed vs Dynamically-typed
  3. Performance vs Fast-prototyping
  4. Special strength

For 1-3 can be easily generalized into comparison between two family of programming languages.

For 4, MATLAB is optimized for matrix operations. So if you can vectorize more code in MATLAB, the performance can be drastically boosted. Conversely, if many loops are required, never hesitate to use C++ or create a mex file.

It is a difficult quesion after all.

I saw a 5.5x speed improvement when switching from MATLAB to C++. This was for a robot controller- lots of loops and ode solving. I spent many hours trying to optimize the MATLAB code, hardly any time optimizing the C++ (I'm sure it could have been 10x faster with a little more effort).

However, it was easy to add a GUI for the MATLAB code, so I still use it more often. Like others have said, it was nice to prototype first on MATLAB. That made the implementation on C++ much simpler.

Besides the speed of the final program, you should also take into account the total development time of your code, ie., not only the time to write, but also to debug, etc. Matlab (and its open-source counterpart, Octave) can be good for quick prototyping due to its visualisation capabilities.

If you're using straight C++ (ie. no matrix libraries), it may take you much longer to write C++ code that's equivalent to Matlab code (eg. there might be no point in spending 10 hours writing C++ code that only runs 10 seconds quicker, compared to a Matlab program that took 5 minutes to write).

However, there are dedicated C++ matrix libraries, such as Armadillo, which provide a Matlab-like API. This can be useful for writing performance critical code that can be called from Matlab, or for converting Matlab code into "real" programs.

Some Matlab code uses standard linear algebra fictions with multithreading built into it. So, it appears that they are faster than a sequential C code.

ReferenceURL : https://stackoverflow.com/questions/20513071/performance-tradeoff-when-is-matlab-better-slower-than-c-c

반응형