게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
계산과학계의 영원한 떡밥, 속도논란! 포트란 vs C/C++
게시물ID : programmer_5812짧은주소 복사하기
작성자 : 포트란90
추천 : 9
조회수 : 14563회
댓글수 : 7개
등록시간 : 2014/10/07 01:25:40
안녕하세요, 
며칠 전에 포트란 유저분께서 포트란 유저를 찾으시는 글을 올리셨기에 존재감을 드러내고자 
재미있는 (이라고 쓰고 콜로세우미라고 읽는) 수치실험 (벤치마크?일까요?)을 해보았습니다. 

이번에 테스트한 시뮬레이션은 분자동역학법 시뮬레이션이라 불리는 입자운동해석방법의 한가지 입니다. 
쉽게 생각해서 분자들끼리의 상호작용 (힘의 합력, 고딩 물리시간에 알짜힘이라 하죠) 을 구한 후, 
분자들에 대해서 뉴튼의 운동방정식, F=ma 라는 연립미분방정식을 수치적으로 풀어주는 물리시뮬레이션입니다. 
가장 부하가 큰 부분이 위에서 언급한 상호작용 계산방법입니다만 이론상으로는 O(N^2) 이지만
여러가지 근사및 기술을 이용하면 어느 정도 부하를 줄일 수 있습니다. 
그 다음 수치적으로 미분방정식을 풀어주게 되는데 이 때는 차분식을 이용하여 수치적분을 해줍니다. 
(개구리가 폴짝폴짝 뛰는 leap-frog 라는 알고리즘을 사용했습니다.)

분자동역학에 대해서 더 알고 싶으신 분들은 구글선생님께 물어보세요. 
(다음 링크를 누르시면 검색할 수 있습니다 http://lmgtfy.com/?q=%EB%B6%84%EC%9E%90%EB%8F%99%EC%97%AD%ED%95%99)

분자동역학에 대한 설명은 이 정도로 하구요,  이번 시뮬레이션의 실행에 있어서 몇 가지 중요한 사항을 언급하겠습니다.

1. 실험의 독립변수는 프로그래밍언어만 되도록 최대한 노력하였습니다. 
* 사용한 계산기성능 : Intel Xeon E7-8870, 2.4GHz 10 cores (OS: CentOS), 계산에는 각각 1코어씩 사용했습니다.
* 컴파일러 : intel compiler (ifort / icc)
* 컴파일 옵션 : -O3 (최적화옵션)

2. 포트란으로 되어 있던 샘플코드를 그대로 C로 번역하여 실행시켰습니다. 
그렇게 큰 프로그램이 아닌 관계로 (약 480줄)
포트란과 C 둘다 메인함수에 모조리 기능을 다 집어 넣었습니다. (인라인전개) 
C언어의 경우에는 주석을 달지 않았기 때문에 실제로는 많이 적게 나왔습니다만, 
주석까지 포함할 경우에는 거의 동일한 길이의 코드가 되지 않을까 생각합니다. 

* 포트란으로 되어 있던 코드를 C로 번역하였다는 내용이 사실 가장 논란의 여지가 있는 부분이라고는 생각합니다. 
하지만 그렇게 복잡한 알고리즘 (2중루프) 도 아니고 단지 반복문을 do에서 for로 바꾼 정도이기 때문에 
개인적으로는 크게 문제 없다고는 생각하고 있습니다. 
한가지 걱정되는 것은 C의 경우 구조체 선언을 하였는데 그게 성능에 영향을 줄지 안 줄지 잘 모르기 때문에 그 부분이 유일하게 마음에 걸립니다. 
문제가 된다면 전체코드를 공개하겠습니다. 

3. 캐시미스가 나지 않도록 최대한 노력하였습니다. (성능에 직결되는 부분이므로)
즉, 행 우선이냐 열 우선이냐를 최대한 지켰습니다. 

* 2차원 배열에서의 캐시미스를 방지하는 방법
C: Row-major order (열 우선)
    for(i=0;i<N1;i++) 
        for(j=0;j<N2;j++)
            arr[i][j]=(...)

Fortran: Column-major order (행 우선)
    do j=1,n2,1
        do i=1,n1,1
            arr(i,j)=(...)
        end do
    end do

4. 그 외 시뮬레이션의 물리조건 (흔히 말하는 미분방정식의 초기조건과 경계조건) 은 거의 동일합니다. 
거의를 사용한 이유는 실제로 난수를 이용하여 초기속도조건을 정했는데
굳이 일치하지 않더라도 계산을 진행하는데 있어서는 크게 무리가 없기 때문입니다. 
초기속도조건 이외의 모든 조건은 일치합니다. 

* 물리조건
분자: 아르곤 8000개
온도: 85 K (영하 188도)
경계조건: 주기경계조건

밑에 그림이 초기배치이구요. (초록색이 C, 빨간색이 포트란 입니다)

0001.png

20만스텝 (스샷에 나와있는 1000 ps = 1 ns = 10^-9 초) 계산 후의 결과 입니다. 

1001.png

그리고 그 중간 과정 (동영상) 입니다. 


(모바일 배려: http://youtu.be/tPBlC801ER8)

일단 동영상을 보니 크게 문제는 없는 것 같습니다. 
자 그럼 이 모든 결과를 얻는데 걸린 시간을 한번 보겠습니다. 

포트란: 3.81 시간
C: 7.02 시간

약 1.84 배 가까운 차이가 났습니다. 
사실 생각보다 차이가 많이 나서 조금 놀랬습니다. 포트란이 빠를거라고는 예상을 하고 있었지만 이만큼 차이가 날 줄은 몰랐네요. 
일단 이만큼 차이가 나게 된 원인을 곰곰히 생각해 봤는데요, 
1. 컴파일러의 성능차이? 
그래서 별도로 gcc 컴파일러로도 계산을 해봤습니다만 결과는 비슷했습니다. 
다만 인텔컴파일러보다는 시간이 좀 더 걸렸지만요. 
(다른 워크스테이션을 이용했기 때문에 절대적인 비교는 불가능하지만 CPU 성능 자체는 더 좋았기 때문에 계산이 느리다고는 말할 수 있습니다.)

2. 구조체 사용과 미사용?
위에서도 언급하였지만 구조체의 사용 유무가 성능에 영향을 주었을지도 모르겠습니다만, 
이 정도까지 느려지는지는 잘 모르겠습니다. 

3. C언어에 최적화 되지 않은 알고리즘?
일단 기본적으로 완전이 똑같은 알고리즘대로 계산을 하기 때문에 둘다 조건자체는 똑같습니다. 
그렇기 때문에 이 알고리즘으로 문제를 해결하는데에는 적어도 C보다 포트란이 우수하다라고 말씀드릴 수 있습니다. 
참고로 외부함수를 불러들이는 것이 C의 경우 많은 시간을 잡아먹기 때문에 
일부러 인라인 전개를 통해서 main함수에 모든 계산을 집어넣었고, 그로 인한 손실은 거의 없다고 할 수 있습니다. 
(도중에 sqrt()함수를 몇번 사용했는데, 그게 설마 성능에 영향을 끼쳤을까요?)

결국은 저도 뚜렷한 이유를 찾지는 못했습니다. (사실 그렇기 때문에 저보다 C를 잘 아시는 분들이 많은 여기에 글을 쓰게 되었지요.)

일단 제가 결론을 내리자면 분자동역학법 등과 같이 특정한 알고리즘에 있어서 
포트란이 C보다 월등히 빠른 계산능력을 보여준다는 것을 확인할 수 있었습니다. 

물론 포트란도 여러 단점들이 있습니다. 
가독성이 떨어진다든지, (국내 한정으로) 사용자가 얼마 없어서 배우기 힘들다든지, 범용성이 떨어진다든지 등등 있지만
적어도 수치해석, 특히 어느정도 규모가 있는 수치해석의 경우에는 C보다 포트란을 사용하는 것이 더 좋을지도 모르겠습니다. 

특히 슈퍼컴퓨터나 클러스터 등에서 이용하는 MPI (Message Passing Interface)의 경우에는 C아니면 포트란이니까요. 
수치해석을 앞으로 전문적으로 하고 싶다 하시는 분들에게는 포트란을 한번쯤 배워보시는 것을 권유해봅니다. 

질문 있으시면 댓글 남겨주시구요, 
읽어주셔서 고맙습니다. 
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호