MATLAB의 행렬연산은 왜 이렇게 빠르죠?

winner의 이미지

Core Duo 1.6Ghz의 labtop 과 Pentium M 1.8Ghz의 두 labtop에서 programming을 하는데
C로 작성해서 Pentium M 1.8Ghz 보다 MATLAB 행렬연산이 Core Duo 1.6Ghz가 훨씬 빠르더군요.
C는 일반적인 반복구조를 쓰구요. MATLAB은 그 반복구조를 하나의 차원으로 삼아서 행렬로 작성되었습니다.

MATLAB도 반복구조를 쓸 수 있는데 그렇게 하면 참을 수 없이 느려진다는 소리를 옆에서 하네요.
MATLAB의 행렬연산은 왜 이렇게 빠를 수 있는거죠?

Core Duo 에서 동작시켰기 때문에 빠를 수 있는 것일까요?
아니면 SIMD?

아기다리의 이미지

상당히 재미있는 글이네요 :)

그런데, 행렬 연산이란게 정확히 어떤 행렬 연산인가요?

혹은, C로 짠 프로그램이 최적화 되지 않은것은 아닐까요?
----------------
agidari.wordpress.com

feanor의 이미지

C로 짠 프로그램이 Strassen 알고리즘을 쓰고 있나요? Strassen 알고리즘을 쓰면 시간복잡도가 n^3이 아니기 때문에 행렬이 클 경우 큰 차이가 날 것입니다.

물론 캐시 메모리 관련 최적화나 SIMD와도 관련이 있을 것입니다.

winner의 이미지

제 기억이 맞다면 Strassen의 order 는 2.7 정도였던 것으로 기억합니다.
물론 행렬이 충분히 크다면 의미가 있지만...
그에 따른 추가 작업도 상당히 많죠.
책에서 읽기는 했지만 그리 큰 의미를 가진 algorithm은 아니라고 생각했었습니다.

제가 하고 있는 것은 행렬곱은 아닙니다.
금융공학의 Binomial Tree 와 Monte Carlo Simulation 을 하고 있는데
전산을 전공한 사람들이 반복구조로 처리하는 것을 수학을 하면서 MATLAB을 배운 사람들은
아예 한차원 큰 다차원배열로 처리해버리더군요.
(아마도 상태가 변하는 변수를 활용한 programming이 능숙하지 않은 것 같더군요.)

Cache가 문제라면 memory를 적게 쓰는 구조가 유리할 겁니다.
하지만 성능이 우수한 MATLAB program 은 차원을 하나 늘리는 방식으로 쓰고 있기 때문에
cache에 의한 성능향상이라고 생각하기가 힘드네요.

제 생각은 MATLAB이 SIMD같은 단일 core 다중처리에 대한 구조를 가지고 있거나
다중 threading 를 활용하는 방식(Dual Core 에서 성능향상이 있을.)이 내장되어 있지 않은가 싶습니다.

확실한 것은 C로 작성된 program이 그리 최적화가 되어 있지 않은 것은 사실입니다만
MATLAB 쪽도 그다지 최적화는 되어 있지 않습니다.

저는 MATLAB 을 그리 좋아하지도 않고, 접해본 적이 없어 어떤 이유인지 알 수가 없네요.

feanor의 이미지

"Cache가 문제라면 memory를 적게 쓰는 구조가 유리할 겁니다."

꼭 그렇지는 않습니다. 예를 들면 행렬을 각 행 단위로 접근하는 것과 각 열 단위로 접근하는 것은 cache locality에 큰 차이가 있기 때문에, 열 단위로 접근하는 일이 필요할 때에는 행렬을 전치해서 행 단위로 접근하는 것이 더 빠를 수도 있습니다.

nike984의 이미지

matlab에서 행렬 연산이 정말 빠르긴 하죠.
저도 요즘 좀 큰 시스템 시뮬레이션을 돌리고 있는데 이게
monte carlo simulation을 써야 하다 보니 반복 연산이 많은데
제가 능력이 딸려서 그런지 반복 구조를 정말 많이 사용하고 있습니다.
게다가 함수 호출도 많고 그래서인지 한번 돌리고 결과를 뽑으려면 시간이
정말 오래 걸리는군요.

orangecrs의 이미지

재미있는 질문이네요. 콩를 믹서기로 가느냐 맷돌로 가느냐의 질문같기도 합니다. 당근 매트랩은 주어진 밸류에 중점을 두고 작성하신 C파일은 그러지 못하니까요. 연산시에 매트랩은 레지스터에 최대한 밸류만은 올리고 계산하는 반면 C코드에는 그전에 계산방법까지 올려야 하니깐 당연한것이겠죠.;; 아마 포트란으로 작성하셨다면 조금이나마 차이를 줄일수 있으실수 있을 것이란 답변도 같은 맥락이겠지요.;; 윗분께서 말씀하신 알고리듬의 문제라면 일수도 있고 아닐수도 있습니다. 이말은 곧 "계산"이란 목적에 맞게 만들어진 툴이 매트랩이고 그게 지금 팔리고 있으니깐요.;;; 그다지 평소 생활에 필요없는 사람은 어떠한 언어를 써도 답을 얻어 써도 시간이 되는 사람들이기 때문이죠. 매일, 1테라의 주식통계를 분석해야한다면 어떤툴을 쓰더라도 하드웨어의 성능을 중요시 해야겠지요. 개인적으로 클러스터를 쓰더라도...
---------------------------------------------------
야!...

---------------------------------------------------
야!...

kalstein의 이미지

속도를 크게 늘릴수 있는방법이...

1.알고리즘
2.SIMD
3.lazy evaluation

정도 있을것 같습니다. SIMD만 잘 활용해도...확실히 1.5배 이상 빨라지긴하겠지요...

제가 matlab을 잘 몰라서 그렇습니다만...만약 님이 하신 operation이 전행렬의 값을 원한것이 아니라 특정부분의 값을 얻으셨다면, 3번방법을 활용했을 가능성도 상당합니다. 3번방법은 A행렬과 B행렬을 계산하려고 할때 실제로 계산을 해두는것이 아니라 단지 수식이 이럴것이라만 기입해둡니다. 실제계산은 사용자가 '(2,2)위치의 값을 알고싶은데?'라고 요청할때에 행해지는거지요...

그럴경우 행렬을 수백개를 곱셈한다고 해도 1개의 element값을 요청하는것은 정말 빠릅니다. 다만...전체행렬을 다 쿼리한다면;;; 계산식을 기입해두는 overhead때문에 훨씬 더 느려지지요 ^^;;;


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

hayarobi의 이미지

core 2 duo 2.0Ghz가 펜D 945(3.4GHz)보다 빠르더군요. 체감 속도 차이를 느낄 수 있을 정도로요. core duo는 64bit명령을 지원 안 할 뿐이지 32bit명령에서는 core 2에 비해 그다지 떨어지지 않는다고 하던데요.

---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥오에스텐, 맥오에스클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com

=================
잠못자는 한솔아빠

saak1978의 이미지

매트랩은 high-level script이기때문에 기본적으로 컴파일해서 명령 화일을 만드는 C보다 느립니다. 다만 복잡한 행렬연산의 경우 알고리듬에 따라서 많은 속도 차이가 날수 있는데, 아마도 C에서 사용하신 알고리듬이 matlab에서 사용하는 알고리듬만큼 효과적이지 못할수가 있습니다. matlab에 있는 많은 function들은 행렬계산에 맞게 알고리듬이 잘 갖추어져 있습니다.

익명 사용자의 이미지

MATLAB의 라이브러리를 C에서 사용하면 적당할 듯 싶군요. ^^

http://www.nbs.ntu.edu.sg/userguide/MatLab/MatLab6/mathlib.html

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.