혹시 3000000x3000000행렬의 역행렬을 컴퓨터에게 어떻게 시키면 되는지 아시는분...

신고
by snowall 2010.07.29 16:53
  • Hybrid 2010.07.29 17:47 신고 ADDR EDIT/DEL REPLY

    구현에 따라 다르겠지만,

    1. 뻣는다.
    2. 0이 나온다.
    3. 무한대(혹은 -무한대) 가 나온다.
    4. 엄청 오래 걸린다.

    • snowall 2010.07.29 20:54 신고 EDIT/DEL

      같은 얘기잖아요 ㅋ

    • Hybrid 2010.07.31 03:17 신고 EDIT/DEL

      엇~ 다른 얘기에요.

      1. 말그대로 다운. 계산 불가. (기다리면 시간 낭비 됨. 따라서 중간 중간 다운되지 않았다는 메세지 등이 필요.)
      2. 0이 나온다. 오차 때문에 생기는 계산상 오류죠.
      3. 역시 무한대도 계산상 오류인데, 가능성이 쉽죠. 0으로 나누거나 하면 무한대는 쉽게 나오니.. 0으로 나누는 것도 실제로는 0이 아닌데, 오차 때문에 0이 된다거나 하면 ~.~ 암튼, 2번처럼 오차 때문에 생기는 오류겠죠. (2, 3번은 비슷하긴 하네요.)
      4. 계산은 됨.

    • snowall 2010.07.31 08:59 신고 EDIT/DEL

      그게 같은 결과인 이유는
      1번 -> 답 모름
      2번 -> 답 모름
      3번 -> 답 모름
      4번 -> 언제 끝날지 모름
      결국 다 모르는 거라서요.

  • 구차니 2010.07.29 18:17 신고 ADDR EDIT/DEL REPLY

    미치지 않을까요 -ㅁ-?

    • snowall 2010.07.29 20:55 신고 EDIT/DEL

      컴퓨터는 미치지 않아요
      정신을 잃을 뿐

  • 탠저린양 2010.07.29 18:29 신고 ADDR EDIT/DEL REPLY

    엄청 오래걸리다가 중간에 렉걸려서 꾀꼬닥!

    • snowall 2010.07.29 20:56 신고 EDIT/DEL

      순수하게 계산만 따지면 300만의 세제곱수 만큼의 계산(덧셈, 뺄셈)을 해야 합니다.
      2GHz의 컴퓨터가 1초에 약 2억번의 연산을 한다고 가정하면, 약 5억초 정도 걸리네요.
      한 10년...

  • Aptunus 2010.07.29 21:00 신고 ADDR EDIT/DEL REPLY

    키시려면 시킬 수는 있겠지만, 보다 효율적이고 빠른 새로운 방법을 고안하는게 관건이겠군요, 물론 슈퍼컴이나 전세계 컴퓨터의 잉여 자원을 쓴다는 가정하에...

    그런데 이 역행렬은 어디에 쓰시려고....;;

    • snowall 2010.07.29 21:41 신고 EDIT/DEL

      그냥 필요하대요...;;

      저도 청탁(?)받은 질문이라서요

      참고로 그 질문하신 분은 (어쩌다보니) 우리나라에서 가장 빠른 컴퓨터를 공짜로 무제한으로 쓸 수 있는 자리에 있습니다.

  • ExtraD 2010.07.29 21:24 신고 ADDR EDIT/DEL REPLY

    일단 Determinant가 0이 아닌지 확인한다. .. 아마 이 작업도 만만치 않을 듯.

    • snowall 2010.07.29 21:40 신고 EDIT/DEL

      Determinant를 적당히 빠른 시간 내에 구할 수 있다면 Cramer rule을 그냥 적용할 수도 있다는 뜻이기 때문에...;;

      저는 기본행연산을 600만번 하는건 어떠냐고 제안해 봤는데 그것도 연산시간이 꽤 오래 걸리겠더군요...-_-

  • 애드민 2010.07.30 00:22 신고 ADDR EDIT/DEL REPLY

    http://arxiv.org/abs/math.GR/0511460의 Coppersmith–Winograd algorithm에 따르면 행렬 곱셈 연산을 n^2.376까지 낮출수 있네요. 그래도 3 000 000^2.37600 = 2.45267555 × 10^15 니까 2 GHz 컴퓨터 1대라면 ((((3 000 000^2.37600) / 2 000 000 000) / 60) / 24) / 365 = 2.33321494 년 정도가 걸리네요. Tesla (http://www.nvidia.com/object/why-choose-tesla.html 515 GFLOPS) 16대 병렬로 연결하면 네트워크 부하 감안해도 ((3 000 000^2.37600) / (515 * 1 000 000 000 * 16)) / 60 = 4.96091332, 5시간 내외로 걸릴 것 같은데.. 비용이 문제네요. 그분은 혹시 KISTI에 계신가요;;

    • snowall 2010.07.30 00:29 신고 EDIT/DEL

      넵. 정확히는 그 근처의 회사입니다. 뭐 자세한건 중요하지 않구요 -_-

      계산 알고리즘도 문제지만, 한번에 메모리에 다 넣고 계산할 수가 없어요. 행렬 전체가 36TB입니다. 36TB용량의 저장소 구축도 일이고 하드디스크에서 읽어올테니 계산하신 것보다 10배에서 100배는 더 걸릴 겁니다. 뭐 500시간이라고 해도 그럭저럭 해볼만하긴 한데요...

    • Hybrid 2010.07.31 03:19 신고 EDIT/DEL

      속도를 빠르게 하기 위해 Tesla 를 이용한다는건 CUDA 를 이용한다는거겠죠? 문제는 얘네들이 한꺼번에 데이타 올라갈 수 있는 양이 정해져 있기 때문에, 약간 알고리즘을 변형 시켜서 부분부분 GPU 메모리에 올려서 계산해야합니다.

      병렬처리니까 계산은 무진장 빠르지만, CPU 에서 한번에 할 수 있는 계산도, GPU 에서는 여러번 메모리에 넣다 뺏다 하면서 계산해야하기 때문에 거기서 부하가 엄청나게 오래걸릴 수 있습니다.
      (요약 : 오버헤드는 하드에서 읽기 쓰기(엄청 큼), GPU 에 메모리 올리기(꽤 큼), GPU 에 나눠서 올려야 하기 때문에 나눠서 계산해야함(꽤 클 수 있음))

      그나마 역핵렬 계산이니.... 뭐, 아에 불가능하진 않을지도?

    • snowall 2010.07.31 08:59 신고 EDIT/DEL

      ㅋㅋ머리가 나빠서 한번에 "많이" 못 외우는게 단점이네요

  • goldenbug 2010.07.31 23:30 신고 ADDR EDIT/DEL REPLY

    세상에... 저걸 왜 구하려 하는 건지???? (설마 게놈 뭐 이런 거랑 관련이 있는 건가요? ㄷㄷㄷ)

    • snowall 2010.07.31 23:54 신고 EDIT/DEL

      몰라요
      근데 유전자 분석이랑은 아마 관련 없을거예요 ㅋ

  • 질럿 2010.08.16 03:57 신고 ADDR EDIT/DEL REPLY

    저는 백만*백만 역행렬을 생각중인데요. 적정한 알고리즘을 찾으실 수 있으면 알려주세요. 클러스터 컴퓨터를 쓸 것이기는 하지만, 높은 수준의 병렬화는 하지 않고 각 노드별로 서로 다른 파라미터를 계산시킬 것이니까, 그냥 보통 피씨에 리눅스를 깔아서 포트란을 돌린다고 보시면 됩니다.

    • snowall 2010.08.16 10:26 신고 EDIT/DEL

      안되는 걸로 결론지은 것 같네요 -_-

      논문 찾아보니까, 몬테카를로 방법이 차선책인 듯 싶어요


티스토리 툴바