2010. 12. 16. 22:12


병신 같은 for문 처리 속도 빼문에 matlab이 느리다고 생각하게 되는데요,
( 그외로 여러가지 약점이 있지만...)

128,000 x 300 matrix를 서로 곱하여 봅시다.

openCV 나름대로 요즘 올라오는거 보면
"Blas 적용했음. 20% 속도 향상 기대함여" 등등이 있는데요,
  -  Matrix multiplication now is done by blocks resulting
90      in better cache utilization => better performance.
91      Optionally, gemm from Intel MKL can be used. (beta 4)
... 대충 코드 위치로 볼때 gemm에 blas 적용은 안된것 같음..


matlab ... 상용 라이브러리 + ublas + 미친듯한 튜닝 으로 0.7 sec를 보여줍니다.

테스트도 쉽습니다. 인터프리터에 rand 하고 * 기호 써서 곱합니다. 그걸 tic;toc으로 감싸주시면 됩니다.
>> tic; AtA = T'*T;toc;
Elapsed time is 0.557990 seconds.
>> tic;T = rand(128*1000, 300); AtA = T'*T; toc;
Elapsed time is 1.167132 seconds.
.....single으로 감싸도 별반 차이없습니다.

openCV 우선 한숨부터 쉬고...

프로젝트 만들고 인클루드하고
우선 timer용으로 쓸 함수 include 하고
openCV 세팅하고
결과를 보기위해 컴파일하고

돌립니다!

    enum { DESC = 128, NUM_DESC = 1000, NUM_PIC = 300 };
    CvMat* M = ::cvCreateMat( DESC * NUM_DESC, NUM_PIC, CV_32FC1 );

    my_pca::randn( M, 100, 20 );

    CvMat* AtA = ::cvCreateMat( NUM_PIC, NUM_PIC, CV_32FC1 );
    ::cvGEMM( M, M, 1.0, NULL, 0.0, AtA, CV_GEMM_A_T );

    ::cvReleaseMat( &M );
    ::cvReleaseMat( &AtA );

10 sec 나왔네요 감사합니다.

randn은 openCV rand함수 감싼건데요 단독으로 400ms 나옵니다.


ㅅㅂ......

결론 :  상용 library와 최적화로 무장한 matlab의 행렬 곱 연산은
           openCV에서 새롭게 적용된 blas 적용 곱하기에 비해 디지게 빠릅니다.



I think its because you are trying to multiply two matrices, which
is speciality of matlab. Its made for matrix operations, and its one
thing its is extremely difficult to beat matlab at.

matlab achieves this speed with matrices by using platform
customized packages for libear algebra namely blas and lapack and of
course lot of intelligent tweaks. If you look in matlab bin
directory you will find files like altas_PIII.dll, atlas_PIV.dll and
mkl_PIV.dll etc. these are the 3rd party packages matlab uses.

atlas is Automatically Tuned Linear Algebra Subroutines - it
contains blas and lapack. It is opensource project.

mkl is Maths Kernal Library which is again optimized implementation
of blas and lapack but is developed by intel so supposedly better.
but mkl is not free.

Now to be fair to opencv I would recommend you try some highlevel
function for example canny. Then you will know the speed difference.

-Saurabh

Posted by newpolaris