포트란이 정말 빠른 이유는?
안녕하세요. 저는 산업기능요원으로 3년간 일하다가 이번 봄에 복학하여 학교에 다니고 있습니다. 3년간 꾸준히 한 덕에, C에 대해서는 어느 정도 자신감을 가지고 있습니다.
예전에 이곳에서 포트란 vs C 논쟁이 있는 것을 몇 번 보았습니다. 그때 제가 생각했던 것은, 최신의 컴파일러 기법이면 C도 포트란에 가까운 수준의 퍼포먼스가 나오지 않을까? 였습니다.
사실, 이런 글을 올리게 된 것은 이번 학기에 듣게 된 컴파일러 수업 때문인데요. 제가 4월 한 달간 교생실습을 다녀오면서 포트란 컴파일러에 대한 발표 과제를 안게 되었습니다.
그 과제를 제가 허접하게 해가게 되었는데, 발표의 주요한 내용은 포트란은 세상이 나오게 된 시대적 배경 때문에 속도가 가장 중요했고, 그래서 문법에 대한 파싱은 그다지 신경을 쓰지 않고, 최적화에 신경을 썼다는 것이었습니다.
발표가 끝나고, 교수님께서 질문하시더군요. "포트란이 정말 그렇게 빠른 이유는 무엇인가?" 저는 단순한 문법으로 인한 최적화가 우수(공통 부분식 소거, 코드 모션, 복사 전파, 귀납 변수 소거, 대수학적 최적화, 레지스터 최적화, ...), 스택이나 동적인 메모리 할당보다는 정적인 메모리 사용, .. 등을 들었는데요.
교수님께서는 그것은 컴파일러에서 프로그램을 잘 최적화하는 것이고, 그 최적화 기법보다 하위 레벨에서 무언가 더 빠르게 해주는 것이 있는데, 그것이 무엇인지 다음주까지 조사해오라고 하시더군요.
포트란의 무엇이 그렇게 속도를 빠르게 해주는걸까요? 일반적인 최적화 기법에다가.. 메모리 사용 방법에다가..?
포트란을 정말 빠를 수밖에 없게 만들어주는 것이 무엇인지 여러분의 조언을 구합니다~
geekforum에서 몇 년 전에 열띤(??) 토론이 있었습니다 :) 참
geekforum에서 몇 년 전에 열띤(??) 토론이 있었습니다 :) 참고가 되시길..
http://geekforum.kldp.org/stories.php?story=02/07/18/9701140
당시 IBM 704와 같은 기계의 명령들과 프트란 구조가 어떻게 대응되는
당시 IBM 704와 같은 기계의 명령들과 프트란 구조가 어떻게 대응되는지 간단히 이야기하는 것도 좋을 듯 합니다.
----
It is essential, if man is not to be compelled to have recourse, as a last resort, to rebellion against tyranny and oppression, that human rights should be protected by the rule of law.
[Universal Declaration of Human Rights]
음.. 제가 알기로는..
fortran 의 경우는 c 언어와 달리...
변수가 모두 정적으로 선언되는 것으로 알고 있습니다.
그냥 변수 선언 없이 i에서 n중에 하나로 시작되는 문자는 정수로, 나머지는 실수로 인식을 하잖아요..
그래서 아직까지 수치해석에서 fortran을 따라갈 언어가 없다(?)라는 것이죠..
Re: 음.. 제가 알기로는..
한가지 의문점이 있습니다
정적으로 할당하는 방식을 취했을 경우
지역화의 이점을 전혀 얻지 못하게 됩니다
예를 들면 OS에서 프로세스에게 할당하는 워크섿 같은 경우 지역화에 대한
효율적 처리를 위한 방법인데요
모든것을 전역 변수처럼 할당했을 경우 , 지역화의 이점을 전혀 얻을수 없고
캐쉬의 적중률도 떨어질테고 , 프로그램 짜는것 자체도 무지 힘이 들것으로
예상이 됩니다 , 물론 함수 스텍에 push 할일도 없고 해서 빠를수도 있겠지만
그런 변수들을 다 관리하기도 힘이 들거라 예상이 되는데
그리고 속도는 단순히 지역변수를 쓴다고 해서 느려진다고도 생각하기 힘듭니다
지역변수는 레지스터사이에서 왔다 갔다 할수 있으니까요
현재 OS가 지역화에 대한 이점을 최대한 얻을수 있도록 최적화 된 환경이기때문에 포트란이 과연 예전처럼 빠른지 .....
궁금하네요
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
저도 포트란 사용자지만 왜 빠른지는 알턱이 없구요 ㅡ,.ㅡ실험실원이
저도 포트란 사용자지만 왜 빠른지는 알턱이 없구요 ㅡ,.ㅡ
실험실원이 포트란으로 짜놓고 나간 시뮬레이션프로그램이 있었습니다. Navier-Stokes 방정식 푸는 것이었는데요.. 대규모행렬을 풀면서 메모리도 제법 사용하는 넘이었습니다. 거의 실수연산이고여 코드자체는 단순무식합니다.
그뒤 다른 실험실원이 그걸 물려받게 되었는데, 포트란이 맘에 안든다고 C로 다시 코딩을 하더군요 -_-;; 그녀석 말로는 C로 짜게되면 좀더 효율적으로 짤수 있는 방법이 있는것 같다며 속도도 더 빨라질것 같다고 했거든요.. 몇주동안 고생하더니
결과는 포트란보다 약간 느리다 였습니다. 지금 포트란으로 된거 돌리고 있습니다. 이유는 잘 모르겠지만 포트란이 느리다면 굳이 현시점에서 포트란을 고집할 이유는 적겠죠. 저희 수준에서도 한번 돌리면 1달이상 돌려야 하는 것들이 있거든요. 10%만 차이나도 3일이나 차이가 나는거죠..
아.. 생각하니 포트란을 고집하는 이유가.... 교수님이 포트란 뿐이 모릅니다. ㅋㅋ
[quote]정적으로 할당하는 방식을 취했을 경우 지역화의 이점을
대부분의 포트란 코드들은 수치연산을 수행하는 코드들입니다. 이러한 수치연산 프로그램들은 처음에 프로그래밍을 할때, 사용될 변수들이 수식으로 정의되어 있읍니다. 따라서 처음부터 전체 프로그램에서 사용될 변수들을 프로그램 전체에서 명확하게 알 수 있읍니다. 따라서, 지역화를 할 부분의 거의 없으므로 지역화로 인한 잇점을 이용할 별다른 필요가 없게 되지요.
프로그램 짤때는 미리 식을 손으로 다 적어놓고 그것을 그냥 스크립트 작성하듯이 옮기는 일이므로, 프로그래밍이 힘든게 아니라, 미리 수식을 손으로 다 전개하는데 대부분의 정력을 사용합니다. 미리 수식을 정리할때 모든 변수를 한번에 다 알 수 있으니, 관리할 일이 별로 없다고 보면 되겠지요. 그리고. 대부분의 subroutine이라는 것에 넘겨질 argument들과 돌아올 return value가 전역변수이므로 이걸 전부 스택에 넣고 다시 꺼내고 하느니 global로 잡아두면 편하지요.
미리 정보를 좀 구하고 하라고 하시죠. 이전에 저도 똑같은 생각으로 한번 해봤고, 결론은 그시간에 있는 코드 한번 더 돌리자였읍니다. 공대생은 먼저 '효율'을 생각해보고 주변에 비슷한 짓을 한 넘이 있는지부터 알아보고 일을 시작해야하는데... 몇주동안이면 결과를 뽑아도 몇번은 뽑았을 것인데...
C로 해서 효율적인 작업은 pre-processor나 post-processor를 만드는 경우입니다. 이럴때도, 메인을 C로 짜고 기존의 analysis 루틴인 포트란 코드를 호출할 수 있도록 하는 것이 효율적입니다.
뭐 쓰다보니 질문하신분의 답변과는 거의 상관없는 내용이네요... 어쨌던, 하는일에 적합한 언어라고 보면 맞지요. Numerical Scripting Language라고 보는 것이 맞을듯....
--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러
http://osl.iu.edu/~tveldhui/papers/DrDob
http://osl.iu.edu/~tveldhui/papers/DrDobbs2/drdobbs2.html
What he said.