본문 바로가기

과학 연구용 도구/Fortran

포트란: 계산시간 확인하기 : cpu_time



■ 초보자들을 위한 팁을 제공하고자 하는 공간입니다.

혼자 책보고 독학하는 경우 발전의 속도가 더디거나 정체할 수 있는데

간혹 만나는 선배나 고수의 조언이 퀀텀 점프를 가져오죠.

그런 크고 작은 발전들을 가져온 팁들을 틈틈이 소개해 볼까합니다.

참고로 포트란 95를 기반으로 한 설명입니다.


계산시간 확인으로 좀 더 체계적인 프로그래밍을

기본적인 포트란 예제들은 몇 초 혹은 1초도 되지 않게 실행된다. 하지만 몇천에서 몇만줄되는 코딩을 하다보면 계산시간이 몇 분에서 몇 십분이 소요되곤 한다. 


좀 긴 계산의 경우 마냥 모니터만 쳐다볼 수는 없기에 소요시간을 안다면 적당히 다른 일을 겸하면서 소요시간 후에 프로그램으로 돌아오면 될 것이다. 보통 계산이 끝나면 알림을 해주는 기능이 있기도 하지만 말이다.


프로그램의 발전적인 측면에서 보면 좀 더 효율적인 코딩으로 계산시간을 줄이는 것이 중요한데 그럴 때 계산시간을 아는 것도 중요하다. 개인적으로 더 나은 코딩이라고 생각했는데 막상 거의 시간 단축이 없거나 오히려 계산시간이 늘어났다면 그것은 효율적인 코딩이라고 보기 어려울 것이다. 


내장함수 cpu_time

[그림1]의 두번째 줄에 있는 내장함수 cpu_time는 프로그램을 실행시키는 동안 cpu가 작동한 시간을 말해준다. 그냥 맨 뒷줄에 한번만 호출해서 표기해도 큰 지장은 없으나 표준적인 계산시간 확장법은 계산이 시작되는 곳에서 한 번 호출하고 계산이 끝나는 곳에서 한번 더 호출하여 두 시간을 빼는 것이다.


[그림1]


수퍼컴과 같은 다른 서버에 접속하여 계산하는 경우 간혹 통신지연현상이 발생하곤 한다. 그럴 경우 네트워크 불량이 cpu time에 영향을 줄 수도 있으므로 시작과 끝시간을 뽑아 차이를 측정하는 것이 좀 더 안전한 방법이라고 할 수 있을 것이다.


[그림2]


[그림2]는 계산이 끝나는 곳에서 cpu_time을 한 번 더 호출하는 모습을 보여준다. 시작할 때의 cpu time을 start_time이라고 하였고 계산이 끝난 후 ene_time을 호출하여 두 시간을 빼 준다. 

두 시간의 차이인 cputime이라는 실수를 프로그램 맨 끝에서 호출해 준다.



[그림3]


[그림3]의 마지막줄 위에서 'It took....' 로 시작하는 부분이 계산시간을 호출하는 명령줄이 되겠다. 위의 코딩에 의한 화면출력은 아래와 같다.



[그림4]


[그림4]의 맨 아래 빨간 괄호의 두 번째 줄에 나와있다. 이 프로그램은 57.91520초가 걸렸다. cpu_time함수는 계산시간을 초단위로 알려준다. 좀 더 긴계산의 경우 몇 백에서 몇 천초가 나올 수 있는데 나중에 이런 시간을 시간과 분 그리고 초단위로 알기쉽게 표현해주는 모듈을 짜볼까 한다.


계산시간 확인 : 수치계산의 basic of basic

사실 나도 이런 시간확인을 적용한지 그렇게 오래되지는 않았다. 몇 분 안에 끝나는 계산이 대부분이고 제대로 계산이 나오면 그걸로 충분했으니까 말이다. 하지만 좀 더 프로그램의 양을 줄이고 계산 시간을 줄이기 위해 업그레이드를 하다보니 시간 확인은 필수였다.


자신의 프로그램의 효율성확인은 물론 여러 시스템의 성능 비교에도 계산시간은 유용하겠다. 

참고로 화면의 햄릿의 대사는 날짜의 끝 숫자 0-9에 따라 다른 말들을 보여주는 모듈이다. 따라서 계산을 기다리는 화면에서 날마다 다른 글귀를 볼 수 있다  :D


2012년 10월 27일 토요일