난수발생기(random number generator)는 통계물리 시늉내기에서 핵심적인 요소 중 하나죠. 다양한 난수발생기가 있고 사용법도 다양하겠지만, 저는 체계적으로 이용하기보다는 남들이 좋다는 거 그냥 갖다 쓰는 식이었습니다.

저는 지금까지 주기가 219937-1인 메르센느 트위스터(MT19937)를 이용해서 시늉내기를 해왔습니다. 제가 돌리는 프로그램은 매우 단순한 규칙을 매우 큰 격자 위에서 매우 많이 되풀이해야 하는 거라서 아무리 코드를 최적화한다고 해도 한계가 있습니다. 그래서 난수를 발생하는데 들어가는 시간을 줄이는 것만으로도 시늉내기 속도가 빨라질 수 있습니다.

최근에 인텔에서 제공하는 수학커널 라이브러리(Math Kernel Library; MKL)가 좋다는 얘기를 아는 분으로부터 들었습니다. 그래서 깔아서 시험을 해봤는데요, 단순히 난수를 발생해서 평균을 내는 시험을 해보니 제가 써왔던 것보다는 빨랐습니다. 그런데 제가 주로 돌리는 프로그램을 고쳐서 돌렸더니 오히려 이전보다 느려지는 결과가 나왔습니다. 아무래도 제가 뭔가 최적화를 잘 하지 못해서 생긴 것 같습니다.

그런데 그 와중에 위의 MT 홈페이지에 가니 최근에 MT보다 더 빠른 난수발생기가 업데이트 되어 있더라고요. 이름하여 SFMT인데요, 그중에서도 double을 지원하는 dSFMT가 빠르다고 소개되어 있길래 역시 다운받아서 시험을 해봤습니다. 그랬더니 기존 MT보다 세 배 정도, MKL의 MT19937을 이용한 것보다 두 배 정도 시간이 단축되었습니다.

제가 원래 돌리는 프로그램에서도 시험해보니 역시 dSFMT가 다른 것들보다 빨랐지만 몇 배씩 빨라지는 건 아니었고 조금 빨라졌습니다. 하지만 역시나 단순 작업을 매우 큰 격자 위에서 매우 많이 되풀이해야 하는 상황에서 이 '조금'이 쌓이다보면 시간이 많이 절약될 것으로 기대합니다.

시험은 여기까지 하고, 다시 본격적으로 시늉내기를 시작해야겠습니다.