C/C++을 이용한 수치해석

geekforum의 이미지

저는 수치해석 관련 프로그램을 직접 만들어서 일하는 연구원입니다. 가장 익숙한 환경은 Linux 이고 C언어를 선호하는 편이지만 대규모 프로젝트에서는 Fortran으로 코드를 개발하는것이 불가피한 경우가 대부분입니다. 제가 생각하기에 그이유는 (1) 좋은 C 컴파일러가 없다는 점과 (2) 좋은 수치해석관련 라이브러리들이 대부분 Fortran으로 쓰여졌다는 점입니다.

같은 알고리즘을 써서 같은 목적을 수행하는 프로그램을 만들었을때 상용 Fortran Compiler가 허락하는 놀라운 속도를 상용 또는 GNU C Compiler 가 도저히 따라잡을 수 없다는 것은 지금까지 C Compiler를 설계해오신 분들이 시스템 관련 개발자들만을 염두에 두지 않았나 하는 생각을 하게 만드는군요. C 언어로 수치해석 관련 일을 할 수 있게 될 날은 과연 오지 않을까요?

익명 사용자의 이미지

> 제가 생각하기에 그이유는 (1) 좋은 C 컴파일러가 없다는 점과 (2) 좋은 수치해석관련 라이브러리들이 대부분 Fortran으로 쓰여졌다는 점입니다.

이야기를 시작하신 분은 위의 두가지 이유를 들었는데 속도 문제가 나기 시작하는군요. 이건 좀 문제가 있지 않은가 싶네요. 속도라... 이건 뒤로 밀어두고 실제로 제가 수치연산 분야에서 포트란을 선택하게 된 이유가 위의 발제를 하신 분의 1,2번입니다. 단 1번에 대해서는 여러 가지로 생각 할 수 있게는데요...

1) 좋은 C 컴파일러가 없다. 고 하셨는데 이것은 아니라고 생각합니다. 이건 최적화의 문제라고 생각이 되는데 포트란의 경우 수치연산을 기초로 해서 속도면으로 최적화를 하면 되겠지만 C의 경우에는 범용 언어이기 때문에 속도만을 생각해서 무조건 최적화를 못한다는 것이죠. 일례로 지금 GCC3 의 경우에도 GCC2와의 호환성을 유지한다고 했지만 초기에는 컴파일이 되지 않는 경우가 종종 있었죠. 이런 이유로 C 컴파일러가 포트란에 비해 수치 연산에서는 분라하다는 생각이 됩니다. 범용성을 따지다 보니 전문성이 떨어진다는 것이죠.

2) 좋은 수치해석관련 라이브러리들이 대부분 Fortran으로 쓰여졌다는 점입니다. 이건 좋은에만 한정되지 않는다는 생각이 됩니다. 쓸 만한, 쓸 수 있는, 쓰고 나서 인정이 될 만한 라이브러리들이 포트란으로 쓰여졌다는 것이 더 맞지 않을까 싶습니다. 좋고 나쁨을 따지자만 그래도 취사 선택이 될 수 있겠지만 포트란에서 쓸 수 있는 다양한 라이브러리들은 포트란 말고는 불가능 한 경우가 더 많다는 것이 저의 생각입니다.

익명 사용자의 이미지

gsl 라이브러리같은건 기존의 포트란으로
개발된 유명한 IMSL이나 NAG 등등과 비교해
보시면 얼마나 기초적인 수준인가를 알 수
있을겁니다. 포트란으로 구축된 다양한 수치
해석루틴의 규모를 인식하고 나면 아마 에레
베스트산 앞에 서있는 느낌이 드실거에요.

익명 사용자의 이미지

에베레스트 아닌가...?

익명 사용자의 이미지

한해 만용운 ;-)

익명 사용자의 이미지

그렇죠 포트란의 역사에 다른 언어가 도전하기란 쉽지 않습니다.
그리고 그동안 포트란도 발전해 오고 있었구요.
C/C++은 범용이고 포트란은 특수목적용이죠.
그리고 상용 컴파일러도 포트란이 C/C++에 비해 상당히 고가인걸로 압니다.
그리고 포트란으로 만든 프로그램도 고가에 팔리더군요.
저번에 전자과 다니는 형이 수주받아서 프로그램 만들어 줬다던데.
2억에 사갔답니다...--;

익명 사용자의 이미지

포트란이 씨보다 빠르단 얘기를 곰곰히 생각해 봤는데

씨피유가 하나일때도 더 빠르다는 얘기가 아닌듯한데여

본문에서도 말했듯이 대규모(씨퓨가 수십개씩 단 놈)에서 포트란이 씨보다 빠른 이유는

병렬컴퓨팅과 관계된 얘기가 아닌지요?

포트란에서는 씨에는 없는 parallel이란 키워드가 있지요

한마디로 병렬 컴퓨팅을 생각하고 만든언어가

아닌가 생각됩니다

익명 사용자의 이미지

포트란이 C보다 빠르다는 것은 맞는 듯 합니다...

포트란이 C보다 오래전에 나왔었고, 실제로 C가 처음 출현했을때부터 '너무 느리다'는 평을 들었었다고 하더군요...-_- 지금 많은 사람들이 가장 빠른 high-level language를 C라고 생각하고 있는 것에 비하면 너무 큰 차이죠..???

물론 당시에는 C컴파일러가 현재처럼 mature하지 않았었고... 그랬겠지만, 포트란이 더 빠른 것은 맞는 듯 합니다....

근데 그냥 제 생각으로는 현재에는 컴파일러 최적화가 많이 이루어져서 포트란과 C가 최소한 비슷할 것이라고 생각을 했는데... 아직도 차이가 많이 나는군요....-_- 이궁... 포인터때문에 optimize할 수 있는 범위가 줄어드는 게 가장 큰 문제라고 생각되네요... ㅡ.ㅡ;

익명 사용자의 이미지

아뇨, 씨피요와 관계없이 수치해석 부분에 있어서 더 빠르다는 뜻이겠지요.
다른 전반적인 부분에 있어서는 포트란보다는 씨가 빠르겠지요.

익명 사용자의 이미지

최근에는 물리학분야등에서 c 나 c++ 언어를 이용한 시뮬레이션 계산이 증가하고 있습니다. 수치해석을 위한 c 라이브러리도 개발되고 있는데 이중에서는 gsl(gnu scientific library)가 많이 사용되고 있는걸로 알고 있습니다. gsl 라이브러리는 c 라이브러리지만 oop 개념을 도입하여 작성된 라이브러리로 c++ wrapping 이 어렵지 않은걸로 알고 있습니다.
gsl 라이브러리는 http://www.gnu.org/software/gsl
에서 찾을 수 있습니다.

스카리의 이미지

솔직히 놀랐습니다.
Fortran은 초등학교 다닐때 잠깐 배워본게 전부이고,
10년이 지나도록 사용해보지 않아서 제가 이 토론에 유익한
답글을 다는것은 어렵겠습니다;;

저역시 C 언어로 밥벌어먹고 사는 많은 사람중의 한명이지만,
다른곳도 아니고 이곳 KLDP의 많은 분들께서
수치해석분야에서는 Fortran이 C 보다 빠르다는 의견을 내놓으시니..

흔히들 말하는 "빅3" (C, C++, JAVA) 중에서는
C 가 가장 빠르며, 광범위하게 사용된다..고 알고 있고,
(물론 각각 고유의 분야가 있고 절대적인 비교는 당연히 불가하니다만..)
포트란, 파스칼, 코볼 등 옛날 언어들은 '당연히'
오래되었다는 이유만으로 비교대상에서 제외했었는데
이 토론으로 새로운 사실을 알게 되었군요..
(학부시절, 기계과 다니던 친구가 레포트랍시고
포트란 코드를 들고와서 물어보던 생각이 나는군요;;;
저는 교수들이 늙어서 C나 C++같은 '최신'-_-; 언어를
사용할줄 몰라서 Fortran만 쓰는줄 알았습니다.)

수치해석과 관련하여 여러 언어들의 성능비교를
해놓은 자료가 있다면 링크를 부탁드려도 괜찮겠습니까?

견문을 넓힐수 있는 기회를 주세요;;;

꼬리) 아래에.. 우리는 자바로 잘하는데요.. 라고 하신분 ^^;
정말 깨는군요 ^o^
'쿨 러닝' 이라는 영화가 생각납니다.
영화는 영화지요;;

스카리의 이미지

제가 받아보는 메일링에 비슷한 기사가 올라왔군요.

아직 전부 읽어보지는 않았습니다만,
대충 훑어보니 이 토론과 전혀 상관없는 이야기는
아닌것 같군요.. (상관없을지도;;;;;)

Matrix libraries for C and C++ 이라는
타이틀로 올라온 기사이며 아래에 URL을 첨부합니다.

IBM dW Linux section 에 있는 기사네요..

http://www-106.ibm.com/developerworks/library/l-matrix.html?n-l-7182

익명 사용자의 이미지

Fortran 이 C 보다 연산이 빠른 이유가 이해가 잘 안되는군요. 조목조목 빠른 명확한 이유를 설명 해 주실 수 있는 글을 볼 수 있으면 좋겠군요.

익명 사용자의 이미지

C는 펑셔널 프로그래밍을 지원하기위해 스텍을 이용하지만 포트란은
그렇지 않습니다. 일단 이게 전체적인 수행속도를 C보다 포트란이
빠르게 합니다. 그 외에 포트란은 데이타들을 스테틱하게 다룹니다.
그에비해 C는 다이나믹하게 다루는게 많습니다.(여기에 첫번째 이야기한
스텍도 포함되는 이야기긴 하죠 ^^;) 스테틱한 데이타를 다루는게
다이나믹한 데이타를 다루는 것 보다 빠른건 당연하겠죠?

ps. 자바는 C보다 훨씬 다이나믹 합니다. JIT가 아무리 발전하고 최적화되더라도
자바보단 C가 빠를 수 밖에 없는게 당연하죠...

익명 사용자의 이미지

포트란은 펑셔널 프로그래밍을 위해서 스택을 사용하지 않는다구요?

이야 신기하네요 ㅡ.ㅡ;

요즘 스택 베이스드 CPU에 대한 내용을 잠깐 훑어봤는데,

요 이야기도 나와야 할 듯. 뭐 스택 베이스드가 높은 컴퓨팅 파워를 가진 것은 아닙니다만...

어쨌거나 스택을 이용하지 않고 펑션의 아규먼트가 레지스터로 교환될 수 있다면 (흔히 C에서 어셈코드 호출하는 규약에서 등장하는) 성능차는 바로 나겠는데요 ㅡ.ㅡ; 이런 경우에 아키텍쳐 디펜던트한 성능차이가 좀 여러군데서 요인이 있겠지만서도.. ㅡ.ㅡ;

익명 사용자의 이미지

유체쪽에선 다 FORTRAN입니다. 누가 개발했지요? 캐나다의 U of Waterloo랑 IBM이 했던가? 정정해 주시기 바랍니다. 대부분 학교 시스템에 들어있는 fortran 컴파일러들이 병렬연산을 지원해서 특히 한달씩 cpu 한 80개씩 묶어서 돌릴때는 포트란이 짱이지여.. CC는 병렬연산지원하는 걸로 아는데 gcc는 안되는걸로.. 원래 개발된 취지에 맞게 수치 계산에는 fortran이 빠른 듯 합니다.

익명 사용자의 이미지

저도 수치해석 좀 해봐서 아는데, 수치해석에서 사용하는 구문이 기껐해봐야 For같은 Loop 문이나 Array같은 변수 구조가 대부분이죠.
이렇게 만들어진건 C나 C++ 포팅하는게 그다지 어려운 일도 아닙니다. 사실 포팅하기 가장 쉬운 분야가 수치 해석 분야입니다. 구조 분석같은 거창한 것도 필요없이 일렬로 쭉 그냥 번역하듯이 구문의 형태만 살짝살짝 바꿔나가면 됩니다. 다만 FORTRAN의 경우 변수들을 공유하는 경우가 많아 잘 찾아서 패러미터로 잘 넘기든가 아니면 static으로 선언해서 전역적으로 사용해야합니다. 모듈화도 안된게 꽤 있기때문에 일렬로 늘어선 구문의 Line 수가 꽤 될 수도 있죠. 마치 어셈블리나 배이직 보듯이 말이죠.

요즘 왠만한 언어들이 Class 개념을 지원하기 때문에 복소수나 백터뿐만아니라, 4원수까지 거뜬히 해결합니다. 특히 복소수 Class 사용하면 감동합니다. 복소수는 Class 개념이 아주 잘 들어 맞습니다.

그리고 그냥 생각나서 하는 말인데,
C언어를 사용하여 FORTRAN 처럼 코딩하면 속도차이가 심할 것 같지는 않습니다. 농답입니다.

제가 작년에 어떤 논문에서 비교해둔걸 봤는데, Linpack 밴치마크를 했더니 분명 FORTRAN이 조금 나아 보이는 징조는 있었습니다만 그다지 큰 성능 차이는 아니었습니다. 그냥 같다고 봐도 무방할 정도 였습니다.
컴파일러가 생성한 프로그램의 속도가 10%이상만 차이가 나더라도 심하게 차이나는 것입니다.

그리고 단지 수치해석 부분만 만든다면 FORTRAN도 사용할만한데, 결과를 파일로 저장한다든지 그래픽으로 보여준다던지 아님 특별한 Hardware로 자료를 넘긴다든지 기타등등의 기능이 필요할때는 댓가를 치루어야 하지요.

그리고 40대 이상의 좀 오래되신 분들이나 FORTRAN 쓰지, 30대나 그 이하 분들이 FORTRAN을 사용한다는게 이해가 안되는군요.
조금 의외입니다.

그리고 제 눈에는 수치 해석 프로그램중 C로 된 것이 더 많아 보입니다. 왠만한 사이트가면 대개 C로 많이 코딩해두었던데..물론 제가 필요로 하는건 선형 대수 계열의 수치해석들입니다.

그러나 다른 고차원적인 뭔가에 대해서는 여전히 FORTRAN이 많을지도.

암튼 그냥 C++ 쓰세요.

익명 사용자의 이미지

예전에 zdnet 뉴스레터에서 GCC보다 ICC가 10% ~ 30 % 정도 더 낳은 성능을 보인다는 벤치마크가 보이더군요..
(기사 찾아서 링크 걸려고 했는데 못찾았습니다.)
컴파일 속도, 생성된 코드의 속도 등에 관련해서 상당히 여러분야에서 테스트했었는데,, 제가 모르는 것들이 많더군요..

아무튼 GCC보다 똑똑한 놈들도 있으니까,,
그런 부분도 고려해야한다고 생각합니다.

참고. ICC 는 인텔 C++ 컴파일러 입니다.
공짜는 아닌 걸로 알고 있습니다.

익명 사용자의 이미지

주제랑 상관 없는 이야기 입니다만..
ICC랑 GCC랑 비교를 하시다뇨..
첫번째, 밴더들이 발표한 벤치마크는 우선 의심하고 봐야한다.
두번째, '스팍 솔라리스가 스팍 리눅스보다 훨났다' 고 이야기 하는거랑 모가 다릅니까?

익명 사용자의 이미지

그 밴치마크는 사기에 가깝다고 알고 있습니다.
밴치마크라는게 따지고 보면 상황에 따라 성능 차이가 나고 자기에게 유리한 테스트만 하면 훨씬 좋은 성능을 보입니다.
Intel의 C/C++가 그런 경우입니다. 자기가 만든거 자기가 테스트하고 우리는 이만큼 좋다라고 하는건 아무래도 의심이 가지요.

제대로된 밴치마크인 SPEC 시리즈를 사용해야할듯 싶고, 전문적으로 검증할수 있는 밴치마크 전문 기관이 비교를 해야 공평하다고 봅니다.

익명 사용자의 이미지

저는 CFD하는 놈입니다.
당연히 lab에서 돌아가는 solver는 모두 fortran으로 되어 있지요.
저는 첨부터 C를 썼고 C++배우고 C++의 장점
을 살려서 수채해석을 할 수 없을까 고민도
했었습니다.(fortran은 정이 안가서..--;)
근데 Web 돌아다니며 이것저것 수치해석에 관한 C,C++,
fortran의 밴치 마크 결과를 보고 솔직히 첨엔
충격(!)을 먹었습니다. C가 fortran의 대략
70~90%, C++은 40~60%.(빠르면 80%) --;;
그나마 C는 fortran에 거의 근접할 가능성이라도 있지만 C++은 아직 컴파일러들이 C++ 표준 스펙 마저도 제대로 구현하지 못하는 실정이니
...
(97년 경에 system program이나 network program하는 사람들이 C++로 전환하려다가 경악했다죠. 컴팔시간은 길고, 덩치는 크고, 특히 실행 속도도 느리니까요. 그래도 그 당시에 비해서 요즘 C++컴팔러는 비교적 "똑똑"해졌다고 할 수 있겠지요.)

기본적으로 분명히 말해서 프로그래밍 언어는
"도구"입니다.(다만, 프로그래머가 주요 언어에
애착(?)을 가지는 것이 문제지요^^) 그런 의미에서 본다면 분명 fortran은 우세하며 앞으로도
충분히 그 명맥을 계속 유지해 나갈 것 같습니다. 솔직히 다른 언어가 "명백한" 장점이 있지 않는 한, 굳이 그 언어를 익히려 달려들 필요가
없으며 그 시간에 논문보거나 하는 것이 더 유용하겠지요.

C++이 수치해석쪽에서 그 영역을 넓힐 수 있을까요? 아직은 힘들 것 같습니다. 워낙 기존의
코드가 fortran으로 되어있고 왠만한 수치해석용 fortran library도 널려 있으니까요.
굳이 OOP의 개념을 좀 써먹으려면 python으로
적당히 필요한거 붙여서 짜는 것이 당장에는 유용할 듯 합니다. 제 좁은 소견으론, C++은 일단 실행 속도 문제도 급선무이지만 유용한 수치해석용 library도 꾸준히 증가되어야 한다고 봅니다.

http://www.osl.iu.edu/~tveldhui/papers/
==>여기에서 C++과 수치해석에 관한 자료를
좀 찾으실 수 있습니다.
(이사람이 Blitz++ 만들었다네요..)

p.s. 혹시 OOP를 수치해석에 어떻게 써먹을 지 고민해 보신분들 없나요...

corba의 이미지

이 사람은 템플릿의 대가라 불리는 펠트후이첸이군요.
소싯적에 이제 이정도면 C++은 접고 다른 언어를 해야 되지 않을까 라고 생각했었는데 이 사람의 논문을 보고 상당한 충격을 받았습니다.
C++의 무한한 가능성을 일깨워 준 고마운 사람입니다.
그래서 아직도 C++을 공부하고 있습니다.
정말 C++로 구현 할 수 있는 기법들은 끝이 없군요. -.ㅜ

익명 사용자의 이미지

"C++ 표준 스펙 마저도 제대로 구현하지 못하는 실정이니 "이라니 이거 언제쩍 얘기인지.
요즘 C++ 컴파일러는 님이 생각하는 것보다 훨씬 나아져 있습니다.

OOP와 수치 해석은 근본 철학의 방향이 정반대이기 때문에 융화조차 될 수 없습니다. OOP는 코드의 실행 효율성과는 담쌓고 시작하는 학문입니다. 만약 효율성 조금 버리고 OOP를 받아 들이겠다 하면 이때는 굳이 FORTRAN을 사용할 이유도 없어지겠지요. 게다가 근 10년전부터 Compiler가 개발된 C++과의 격차를 좁히기란 아주 어려워 보입니다.

그래서인지 FORTRAN은 이제 범용 언어에서 많이 멀어져 있습니다. FORTRAN으로 그래픽이나 멀티미디어 프로그램 짜보았습니까? 물론 안되는건 아닙니다. FORTRAN으로 Database 프로그램 짜는 것 구경은 못해봤지만 아마 될 수는 있겠습니다. FORTRAN으로 네트웍 프로그램 만드는 것 역시 구경도 못해봤고 될 수는 있겠습니다만 다른건 몰라도 아주 힘들어 보이는군요.

역시 FORTRAN은 수치 해석 프로그램으로서만 제격입니다. 게다가 C/C++이 수치해석 쪽으로 발을 넓히기는 기본 철학이 다르기 때문에 앞으로도 무리일 것입니다.

COBOL이라는 50년대 언어는 요즘 나온 좋은 Database 언어들에 밀려 거의 사라지기 일보직전인데, 여전히 유지보수라는 업(Karma)를 바탕으로 명맥은 유지하고 있는 걸로 보입니다.

사실 FORTRAN도 비슷한 경우입니다. FORTRAN으로 만든 프로그램이 효율성이 더 좋기는 하나 50년대부터 만들어 놓은 코드들(그 기간만큼 신뢰성까지 검증된)을 재사용하기 위한 이유가 더 큽니다.

그리고 FORTRAN 컴파일러를 만드는 회사들도 그것을 간파하고 수치 해석에 더 최적화된 코드를 만들도록 컴파일러를 만듭니다.

Compaq에서 만든 FORTRAN은 병렬처리까지 지원해줍니다. 수퍼 컴퓨터나 중대형 컴퓨터에 끼워 파는데, 이 컴파일러 자체의 가격만도 엄청납니다.

그리고 딴지를 조금 걸자면, 무언가가 빨리 작동한다라는건 단순하고 여러 오버해드가 없기때문에 그런 것입니다. FORTRAN에서의 변수들은 대개 강하게 묶여 있습니다. 즉 공유 정신이 강하지요. 반면 C나 파스칼, 배이직은 언어들은 변수들에 대해 기본적으로 복사본을 만들고자 합니다. 이런 차이가 수치해석에서는 약간의 성능차를 보이는 것 같습니다.

단순 무식하게 투지와 조직력으로 축구해서 4강 가는 것도 나름대로 잘하는 것이고, 현란한 개인기를 바탕으로 화려한 축구를 보이며 우승하는 것도 참 잘하는 것이지요.
제 생각에 FORTRAN은 전자고, 후자는 C++입니다.

익명 사용자의 이미지

VC는 템플릿 같은게 표준을 못지키지 않은가요?

익명 사용자의 이미지

.Net은 모르겠지만 VC6는 확실히 표준과는 약간 거리가 있습니다.
하지만 써본 결과 특별한 경우가 아니면 문제는 없었습니다.
템플릿 쪽이 좀 문제더군요.

익명 사용자의 이미지

STL쪽은 거의 완벽히 못 지켜내던것 같던데요...
지켜내는 것 조차 쓸수 없을 정도로 느린것 같구요..

익명 사용자의 이미지

경험상 보자면, 기계공학쪽에서 새로운 코드나 프로젝트를 수행한다면

1. Structured Grid & Fluid Dynamics
- Fortan에다가 Fortran90 및 loop align등을 잘 수행하는 것이 최적의 성능을 냄

2. FEM & Unstructured Grid
- 포트란으로 많이 되어있지만 새로운 개발을 시작한다면 C나 C++을 사용하는것이 좋아보임. 동적인 자료구조가 필요하고 linked list를 조금만 도입해서 잘 쓰면 훨씬 간결하고 효율이 좋아질 가능성이 많음

3. Control & Optimization
- 이건 실제 계산에 걸리는 시간이 위의 두 경우보다 작아서 Matlab을 사용하는 것도 상당히 효율이 좋아보임. Matlab으로 한줄이면 되는것을 실제로 짠다면 골병듬

1~3까지는 그래도 BLAS나 NAG등을 잘 사용하지 않으니까 사실은 대부분 기존의 라이브러리를 사용한다기 보다는 기존 선배의 프로그램을 사용하는 경향이 많아서 선배의 랭귀지를 따르게 되는 경향이죠

하지만 물리학이나, 기상쪽은 의외로 matrix 연산등을 기존의 library를 사용하는 경우가 많아서 아마 포트란에서 벗어나기가 상당히 힘들어보이더군요.

사족으로, Code의 재활용측면에서 가장 장점이 있을것같은 랭귀지가 C++이라고 생각하는데, 조사결과 포트란의 경우 code reusability가 약 80% 정도 된다는 연구 결과가 있음다. 놀랍죠? 그만큼 포트란 유저들이 좀 게으르죠. ㅋㅋㅋ

익명 사용자의 이미지

저도 최적화된 c 가 포트란보다 많이 느리다는거에 대해 의아해 생각했는데 동감입니다.

c도 적절한 포인터와 최적의 코드로 알고리듬을 잘 만들었을때는 포트란과 거의 비슷할거라 생각합니다.

익명 사용자의 이미지

글을 쓰신 분께는 약간 이견이 있습니다.
포트란이 빠르기는 하지만 그건 조건부입니다.
C로 만든다는 것은 C를 이용한 Extensive한
최적화를 하겠다는 것인데, 이렇게 하면
포트란 만큼은 나옵니다. 물론 라이브러리를
써야 하는 경우가 많은 경우에는 어쩔 수
없지만 그게 아니라면 저 같은 경우는
훨씬 빠른 코드를 만들 수 있었습니다. 참고로
저는 C로 3차원 유체역학 Solver를 만들었
었습니다. 약 15%정도 FORTRAN에 비해서 빠르
더군요. 실은 FORTRAN으로 된 놈을 기본으로
해서 C로 바꾼 후에(저도 C가 더 편해서)
제가 하는 한도 내에서 C만의 특징을 이용해서
최적화를 했습니다(메모리 줄 잘 세우기,
데이터 줄 맞추기, 루프 손 봐주기 등등).
이렇게 하면 FORTRAN 버전 보가 훨씬 사용이
편하면서(설정 파일, 동적 메모리 할당,
및 편의 기능(GUI랑 붙이기 등등)) 위에서
말씀 드린 것 처럼 15% 정도 더 빨랐습니다.
평균이라 Grid 데이터의 종류에 따라 많으면
35% 정도, 적어도 10% 정도는 빠른 것으로
나왔습니다.(이걸로 발표도 했었습니다,
빠르기는 하지만, C로 코드를 만드는 것은
공기 역학 공돌이 들에게는 별로 편한 일은
아니다라는 결론이었지요... 물론 특별한
경우는 빼고) 제 생각에는 대부분의 수치
해석 라이브러리들이 FORTRAN을 거의 직역한
것이 많고 이걸 그냥 컴파일 하면 당연히
FORTRAN 컴파일러 만큼 못합니다. 최선을
다해서 손본 동일한 알고리듬 구현체를
동일한 아키텍쳐에서 비교하는 것이
정확한 결과라고 생각합니다.

익명 사용자의 이미지

하나 궁금한것이 원본 포트란코드에서 최적화(메로리 줄 잘세우기,
데이터줄맞추기, 루프손봐주기 등등)을 수행한 결과와 비교해서
15% 정도 빨라지던가요? 제 경험으로는 똑같은 포트란 코드를
위의 최적화 과정을 거쳐서 다시 컴파일하고 사용하면 원본포트란에
비해서 거의 30% 이상 빨라지던데요...
당연히 do loop change는 해야할것이고...

잘 짜여진 코드들은 포트란이던 C든 비슷한 속도를 내지요.
그리고, Gnu compiler의 경우는 상용 포트란이나 C에 비해서 현저히
느리다는 것은 익히 알려져 있는 사실이지요. 그리고 GUI랑 붙이는것은
C와 Fortran의 calling convension만 맞춰주면 그다지 큰일은 아닌데...

그리고, 사실 시물레이션이라는 것이 최적화하고 랭귀지 change하는동안
느리더라도 한번 더 돌리고 나온 결과를 discussion하는 것이 더 낫다는
것이 경험상의 이론이죠. 특히 공기역학이라는것이 결과 빨리 나온다고
좋은 논문 안된다는 것이야 알려져 있는 사실이고 ^^

근데 겁쟁이 둘이 하는게 비슷한데 이름까면 서로 아는사이일거 같어 웬지

익명 사용자의 이미지

예 당연히 포트란으로 최적화를 한 코드를 C와 비교한 것입니다.(저도 그정도
는 할 줄 압니다, 헤헤 :-) 아마 이름까면 알지도 모르는 사이일 것 같은데
저는 C가 필요했던 이유는 Distributed Computing이 필요해서 입니다.
분산 설계 최적화 뭐 이딴거를 포트란으로 하는 것은 너무나 힘든 일이고
또 C로 손 최적화에도 어느정도 자신이 있기도 하고 해서...

권순선의 이미지

이름 까는 것을 두려워 마시고 약간의 시간을 들여서 사용자 등록을 해 주시면 안될까요. :-)

등록시 꼭 실명을 넣을 필요는 없습니다. 사용자 등록은 사용자를 구분하기 위함이지 사용자가 누구인지를 알고자 함은 아니며 등록시 사용하신 이메일 주소는 사용자 등록을 해도 다른 사람이 볼수 없습니다.
--
WTFM :-)

우겨_의 이미지

답장으로 메일 받기로 메일을 받아보니깐, 답장단 분의 메일주소가 보이던데요.

권순선의 이미지

앗 그런가요. 전혀 생각도 않고 있었는데.... 지금 이 글에 "답장을 메일로 받기" 기능을 선택한 상태로 글을 올렸습니다. 우겨 님께서 답장을 한번 올려 보시겠습니까?

korweblog 개발자에게 알려줘야 하겠군요. :-(
--
WTFM :-)

우겨_의 이미지

To: "우겨"
Subject: Re: 답장으로 메일 받기로 메일을 받아보니깐, ...
From: "권순선"
Date: Fri, 19 Jul 2002 14:37:00 +0900

순선님 메일주소가 xxx@kldp.org군요. 스펨메일 잔뜩 보내드리겠습니다 ;;

익명 사용자의 이미지

순선님께 제안...
ㅎㅎㅎ 로그인된 분들 이메일이 전나 심플한 암호화를 써더군요.
거의 시저가 보내는 암호문이던데요...
A-> X
B-> Y
C-> Z
이런식으로 로테이팅 시켰는데... ㅋㅋㅋ 1분이면
원본 이메일이 나오던데요 ^^

익명 사용자의 이미지

KorWeblog자체의 결점일수도 있겠군요.
암호를 작정하고 풀면 풀리겠지만.. [노력도 적게 들면서]

그럴 분이 몇이나 될지는 궁금합니다.;
어쨌든 해결되야 할 문제가 하나 더 생긴거 군요.

권순선의 이미지

이메일 주소를 직접적으로 보이지 않게 하는 근본적인 목적은 웹사이트 상에서 이메일 주소를 긁어가는 스패머들로부터 사용자를 보호하기 위한 것이지 이메일 주소를 완전히 감추어 버리는 것에 일차적인 목적이 있는 것은 아닙니다.... 물론 이메일 주소를 완전히 인식 불가능하게 해버리면 가장 좋긴 하겠지만 일차적인 목적인 스패머들로부터의 사용자 보호 기능은 현재 어느정도 만족하고 있다고 생각됩니다.

이정도로 해두었는데도 일부러 실제 이메일 주소를 계산해 내서 이메일 목록을 뽑아내는 스패머라면 사실 웬만한 방법으론 막기조차 어렵겠죠. :-)
--
WTFM :-)

익명 사용자의 이미지

대체 이 분들 이름까면 누군인지 궁금해지는군요.

크크크

한번 까봐요..

익명 사용자의 이미지

전역과 정적으로
그리고 스택을 쓰지않는
C 가 있다면
포트란의 속도와 어깨를...

오장현의 이미지

본문과는 그다지 상관없는 내용이지만 포스팅 해봅니다.

수치해석 프로그램은 대개 상용 Fortran 컴파일러를 사용하고 있는 것으로 압니다.
하지만, GNU의 Fortran 컴파일러인 g77은 얘기만 꺼내도 사람들이 고개를 내젓더군요.
코스웍 때에는 교수님이 g77은 사용하지 말라고 명시하기까지 하셨습니다.

주위 얘기를 들어보면 의미없는(!) 결과가 나오는 경우가 있고, 심지어 컴파일조차 안되는 경우가 많다고 합니다.
(저도 경험했습니다. -.-;;)

C 컴파일러인 gcc의 명성과 달리 g77은 왜 이다지도 초라한 것일까요? :(

오장현의 이미지

정정합니다.

g77을 사용하지 말라고 명시한 게 아니고,
다른 유닉스에서는 해 봤는데, Linux에서는 안해봤다였군요... 쿨럭;;;

익명 사용자의 이미지

g77은 제대로 된 포트란 컴파일러가 아니라 f2c를 gcc와 함께 같이
내부적으로 묶어놓은거지요. 제대로 된 포트란 컴파일러가 아니죠.

익명 사용자의 이미지

틀렸습니다. f2c는 별도의 툴이고 g77은 g++과 마찬가지로 gcc의 frontend로 만들어진 완전한 포트란 컴파일러입니다.

익명 사용자의 이미지

저 역시 주로 수치해석을 하는 사람입니다. FEM같은 경우는 주로 기존의 방대한 라이브러리 때문에 선택의 여지가 없이 포트란을 사용할 수 밖에 없었지요.
그러나 요즈음 하고 있는 수치해석은 주로 차분을 이용하는 알고리즘이라서 기존 라이브러리가 필요하지 않습니다. 그래서 양쪽을 모두 고려하고 있는데요.
제가 같은 차분 알고리즘 코드를 fortran90과 C++ (껍데기만 그렇고 정확히는 C 입니다)으로 모두 구현해 보았을 때 이상하게도 C가 20~30%정도 빠른 결과를 얻었읍니다.
OS : win2000,
fortran compiler : compaq visual fortran 6.5
C++ : VC++ 6.0

이 경우 포트란90은 allocatable memory를 사용하였는데요.. 이 결과가 기존의 포트란이 더 빠르다는 통설과는 배치되는 결과이어서 사실 좀 의문이 듭니다.
기계과 수치해서 하시는 교수님께서 요즘은 C가 더 빠르다는 이야기를 하신적도 있다고 하는데요..
여러분의 경험은 어떠신지요?

익명 사용자의 이미지

http://www.ulib.org/webRoot/Books/Numerical_Recipes/

전 수치해석에 문외한 입니다

위체 온라인문서(pdf) 있는데

책이 포트란과 씨 둘다 있던데

누가 컴파일해서 비교좀 해주세여

꼬리 : 수치해석에서 포트란과 씨의 성능에

차이가 있다는 것이 참으로 이상하게 들립니다

프로그램하기 쉽다면 그러려니 하겠는데여

익명 사용자의 이미지

C++의 template을 intensive하게 사용하는 방법으로 Fortran과의 속도 차이를 극복하려는 노력들이 꽤 있는 것으로 알고 있습니다.

제 자신이 fortran에 대해 잘 모르기 때문에 질문하신 분에게 얼마나 유용할지는 모르겠지만, 관련 사이트를 링크하겠습니다.

Blitz++ : http://www.oonumerics.org/blitz/

근데 얼핏 보니 아직 컴파일러들이 C++ 표준을 제대로 다 구현하지 못하고 있는 실정이기 때문에 사용할 수 있는 플랫폼이 제한적이라는게 문제이겠네요 (다행이 g++ 최신버젼에서는 컴파일이 되는 듯합니다. VC++에 대해선 언급도 없군요 -_-;;)

익명 사용자의 이미지

님께서 링크하신 사이트에 가보니
M$ VC++에 대한 언급이 있네요.
http://www.oonumerics.org/blitz/platforms/

■ Supported platforms

○ The free gcc GNU C++ compiler, available on many platforms. You will need version 2.95 or later (or egcs 1.1 or later). Note that you can run gcc under Windows with Cyg-Win32.
(버전 2.95 이상이면 가능합니다.)
○ KAI C++, a superb optimizing C++ compiler. Available for most unix platforms (including Linux). Now (12/99) available for Windows NT.
○ Metrowerks Codewarrior
○ DEC cxx V6.0-010 or better
○ Cray C++ 3.0
○ SGI C++ 7.3 or better

■ Plausible (but not actively supported) platforms

○ Visual Age C++ 4.0
○ Intel C++ a compiler for x86s.
○ aCC 1.13(?) (HP-UX)
○ Borland C++Builder 4.0 or better (음... 이것은 저의 주력 개발툴입니다.)
○ Tera C++ compiler

■ Unsupported platforms

○ Portland Group C++ will be supported once they fix some problems with symbol table lengths.
○ Visual C++ 6.0: Does not support member templates outside of class declarations, and crashes (CRASHES!) if you try to do so. Definitely not recommended.
(지원하지 않는 플랫폼 중에 특별히 혹평의 대상의 됐군요. -_-;;)
○ Borland C++ 5.0
○ Borland C++Builder 3.0
○ XL C++ 3.1 (AIX)
○ Sun SC5.0 (Solaris)
○ Watcom 11
○ TenDRA 4.1 (but it's awfully close)'
○ CC: WorkShop Compilers C++ 4.2 (SunOS 5.6)

익명 사용자의 이미지

토론을 제안한 사람입니다.
먼저 순식간에 이렇게 많는분들이 답글을 쓰신것에 놀랐습니다. KLDP가 대단한 사이트란걸 새삼 느끼구요.

몇몇분들의 얘기가 C/C++ 혹은 JAVA로 문제없지않냐는 말씀이신것같아 제 생각과 경험을 말씀드리려고 합니다. 저는 현재까지 전세계적으로 출시된 왠만한 C 와 Fortran Compiler를 거의 모두 주기적으로 벤치마킹하고 있습니다. 보통 6개월 내지 일년정도에 한번씩은요. 한가지만 예를들면 최근에 꽤나 인기를 끌고있는 인텔에서 출시한 Fortran 컴파일러는 기존의 다른 Fortran 컴파일러보다 적게는 20-30%, 많게는 100%까지 향상된 계산속도를 보입니다. 같이 출시된 인텔의 C 컴파일러는 기존의 여타 Fortran 보다 오히려 성능이 떨어지는데 반해서요.

거의 모든 벤더들은 두 언어용으로 컴파일러를 출시하고 있지만 Fortran 이 평균 20-30% 정도 더 빠른데 예외는 하나도 없습니다. 제가 토론하고 싶었던 첫 주제는 바로 이 컴파일러의 성능문제였습니다.

JAVA 혹는 matlab 라이브러리는 유용합니다.
하지만 속도가 느려서 수퍼 컴퓨터나, 32, 64-cpu 클러스터에서 한달씩 걸리는 병렬계산을 그렇게 하는건 엄청난 낭비 입니다. C 에 대해서도 다르지 않습니다. Fortran 으로하면 2-3주면 결과가 나오거든요. CPU 타임이 돈이란건 다들 잘 아시지요?

첫글에서도 말씀드렸듯이 저는 C 로 코딩하는걸 선호합니다. 수없이 많은 편리한점이 있죠. 잘 아시다시피 특히 리눅스 에서 더 그렇구요. 하지만 수치해석에서는 속도가 안나오면 쓸수가 없습니다. 이게 바로 제가 품고있는 안타까움이지요.

하루빨리 C/C++ 로 수치계산용 코드를 쓸수있는날이 오길 바랍니다.

익명 사용자의 이미지

C언어 문법의 소스를 포트란 컴파일러의 바이너리로 생성해주는..

거기에 C언어와 포트란의 양쪽 라이브러리를 (자연스럽게)호출해줄 수있는..

그런 컴파일러를 원하시는 거네요..^^;;

충분히 만들 수 있지 않나요?

옵티마이징을 어디에 하느냐의 문제밖에 없는 듯 한데요..

익명 사용자의 이미지

일단 관련 라이브러리가 c 로 되있는것들이 많아야 쓰여지지 않을까요.

제가 이쪽 상황은 잘 모르지만 포트란을 쓰는 이유가 이전에 만든 소스가 포트란 이기때문에
반 강제적인면이 있지 않나 싶네요.

그렇지만 c/c++ 로 쓰여질때의 잇점은 라이브러리의 개발속도라든지 포트란이 가지지못하는 여러잇점이 있다고 생각합니다.

자주쓰이는 라이브러리는 어셈블러로 만들고 이 모듈을 c에서 불러들이수도 있으니까요.

익명 사용자의 이미지

.....!
포트란은 용법에 맞으면 매우 간결하고 명확한 언어지요
변수명 앞에 IJKLMN 식의 특이한 문법만 잘 소화한다면요...

익명 사용자의 이미지

포트란으로 수십년간 작성되고 안정화된
수치해석 라이브러리들을 C/C++로 대체하려면
다시 엄청난 시간이 걸리겠지요. 그럴만한
필요성도 그렇게 많지 않은것도 사실이고요.
어차피 수치해석이라는게 컴퓨터 계산에 알맞게
이산화 시켜놓으면 대부분 똑같은계산의 무수한
반복이기 때문에 pre,post processing을
제외한 순수계산쪽에서는 Fortran도 그 유용성
을 계속 지니고 나가리라 생각됩니다.

예를 들어 유한요소법(FEM)을 예로 들면 요소
하나 하나가 아주 OOP적인 개념을 적용하기에
딱 알맞죠 하지만 실제 문제를 풀기위해 방정식
을 세우면 엄청난 행렬을 지지고 볶고하는
정형화된 패턴으로 계산을 수행하게 됩니다.
여기서는 그냥 만들어진 행렬을 그냥 기존의
계산루틴에 집어넣어버리면 결과가 잘 나옵니
다. 여기서 Fortran의 간결한 문법과 그에
따라 얻게되는 빠른 실행속도의 컴파일된
바이너리는 좋은 성능을 발휘하게 되는거죠.

이런 fortran루틴이야 C나 C++에서도
라이브러리 형식으로 불러쓸 수 있으니
재작성할 필요도 없고....

하여튼 수치해석의 pre,post processing
을 제외한 부분에서는 fortran의 유용성이
계속 유지되리라 봅니다.

익명 사용자의 이미지

말씀대로 대단하군요. Fortran은 재귀호출이 안되어서 퇴출된 줄 았았는데, 그렇게 강력한 라이브러리로 무장을 하고 있다니 놀라울뿐입니다.

저 같은 경우는 대학원에서 수치해석 할때 주로 matlab라이브러리를 이용했거든요. 코드도 짧고, 확실하고, 결과물도 마음만 먹으면 언제라도 확인해 보고 출력해서 분석할 수가 있어서 좋았습니다.

근데 어떻게 포트란이 C보다 더 빠를수가 있죠? 놀랍군요. 아니면 제가 편견에 사로 잡혀 있거나요. 혹시 c계열과 달리 스택을 구성하는 과정이 없어서 반복 처리에 강한것은 아닐지요?

익명 사용자의 이미지

matlab의 경우는 편리하긴 하지만...

(개인적으로는 문법이 익숙치 않아서 좀 힘들었지만)

느린 속도를 감수할 수 밖에 없겠지요.

익명 사용자의 이미지

우린 자바로 잘하는데요.

-영희-

익명 사용자의 이미지

수치연산에 대해 이해가 좀 부족하시군요.

수치연산에 대해 좀만 아신다면 그런말 못합니다.

참고로 전 c/c++ 프로그래머입니다.

익명 사용자의 이미지

나도 자바 프로그래머지만, 이런 놈은 정말 싫다.

익명 사용자의 이미지

"대규모 프로젝트" "불가피" 라고 윗분이 말씀하신것 같은데요.

익명 사용자의 이미지

역시 포트란이 살아 남을 수 있는 이유가 있었군요...
특히 복소수연산쪽이 빠른걸로 아는데...
과거에 C++의 템플릿을 이용해서 최적화된 복소수연산 라이브러리를 구축한 사람이 있었는데...
제일 빠를 때가 포트란의 90%정도 였다더군요.
C++로는 경이로운 기록이죠. :)
역시 상용포트란을 이길 수는 없나보네요 ^^;

익명 사용자의 이미지

Fortran이 그쪽에서는 그렇게나 중요하게 쓰이는 줄은

몰랐습니다. Fortran이란게 있다는 정도만 들어

봤을 뿐, Fortran Compiler나 Fortran을 쓰는
사람을

주위에서 접해본 적이 없거든요. 어차피 언어란

목적에 맞게 사용되는 거라고 생각합니다. C로

모든 것을 할 수 있게 될 수는 없으니까요.

kickfools의 이미지

토론을 하자는건지 싸우자는건지 모르겠지만 ICC 얘기는 좋은 C언어 컴파일러가 없다고 했으니 한거겠죠. 또한 ICC는 GCC기반으로 Intel에 최적화했으니 Intel플랫폼에서 빠른거 맞습니다. 벤치마킹에 대해서 ICC는 Intel이 한걸 어떻게 믿느냐하고 IFC에 대해서는 믿으면서 다른 언어 컴파일러와 비교하시는군요.

많은 용어를 혼동하시는 것 같으니 미신만 짚고 넘어갑니다.
1. 구조적 프로그램은 느리다.
구조적 프로그램은 CPU에서 구조적으로 실행되기라도 한다는 말인지요. 지역변수와 함수의 스택 사용은 기계의존적인 내용입니다.
2. 수치해석과 알고리듬은 서로에게 양날검으로 작용한다.
"수치해석은 해석학 문제에서 수치적인 근사값을 구하는 알고리즘을 연구하는 학문이다."
http://ko.wikipedia.org/wiki/%EC%88%98%EC%B9%98_%ED%95%B4%EC%84%9D
3. 정적 할당은 동적 할당보다 빠르다.
가상적인 선형 메모리 공간을 갖는 현대의 컴퓨팅 환경에서는 의미가 없습니다.
4. Fortran은 표준 스펙 제대로 구현한다.
"it has an inane amount of issues among different compilers and architectures driving you crazy." http://stackoverflow.com/questions/146159/is-fortran-faster-than-c
5. GNU compiler는 느리다.
특히 GCC는 현재까지 나왔던 모든 컴파일러를 통틀어서 가장 많은 종류의 최적화기법을 갖고 있어서 ICC 개발자들도 인정한 컴파일러입니다.

나그네나그네의 이미지

정적 할당은 compile time에 변수의 주소가 정해져 있습니다.

동적 할당은 malloc(size) 함수를 파 보시면 먼저 OS에 Heap공간을 주문한 다음, 이 공간에서 size만큼 빈 contiguous한 메모리를 찾습니다. 이 과정에서 시간이 소모됩니다.
(이 시간을 줄이기 위해 꽤 많은 방법이 제안되었지만, compile time에 주소를 결정하는 정적할당보단 훨씬 느릴수밖에..)

그리고 개인적으로 1번도 구조 프로그래밍이 procedural programming보다 느릴 수 밖에 없다고 생각하는데, 이유는 함수 시작부분과 함수 끝 부분에 stack에 push하는 instruction과 pop하는 instruction이 포함되어 있기 때문입니다.

cleol의 이미지

http://benchmarksgame.alioth.debian.org/u32/fortran.php

아마 다들 잘 알고 계신 벤치마크 사이트일겁니다.
제가 기억하기로는 몇 년 전에는 분명히 위 벤치마크 사이트에서 Fortran쪽이 더 나았던 것으로 기억합니다.
하지만 요새는 C++이 Fortran과 비교해서 오히려 나아보이네요.
수치 해석 분야를 잘 모르지만 저 사이트는 꽤 신뢰할만하다고 알고 있습니다.

페이지