김형준님의 놀고 있는 비디오 메모리 활용이란 글을 보고 언젠가 꼭 한번 실험해 봐야지 라는 생각을 했었다. 🙂 그리고 했다!
그리하여, opengl_allocator라는 테스트 프로그램을 하나 작성해서 테스트를 해보았다. VS2003에서 작성하였으며 OpenGL 드라이버가 1.5이상을 지원해야한다.
실험 방법은 다음과 같다.
Video Memory에 1메가의 메모리를 할당하고, Main Memory에는 1메가짜리 2개를 할당한다. Video Memory -> Main Memory, Main Memory -> Video Memory, Main Memory -> Main Memory의 세가지 경우를 memcpy함수를 이용해 측정하였다. (혹시 몰라서 Main->Main은 2번 측정했다.) 각 경우별로 1000번씩 반복하는 것을 1회 실험으로하고 이를 25번 샘플링하였다.
실험환경은 Intel PentiumD 945 (Presler, 3.40Ghz*2, 2048K*2 L2 Cache, 800Mhz FSB), PC2-4300(2Gb), Nvidia 6600 (256Mb) 이다. OS는 Windows 2003 Enterprise Edition, 개발툴은 VS2003이다. (회사컴… T_T)
각 경우에 대한 실험결과는 다음과 같다.
V->M | M->V | M->M |
1420.68 | 1690.64 | 4858.12 |
참고로 각 실험결과를 Z-검정해본결과, V->M과 M->V는 확실히 속도가 다른것으로 나왔다. (그냥 봐도 안다.)
확실히 비디오 메모리가 빠르긴 빠르다. 허나 좀 더 큰 용량을 해볼필요가 있다고 판단.. 10메가의 메모리를 할당하고 실험을 해보았다. (시간의 압박으로 100회반복, 25번 샘플링을 했다.)
결과는 다음과 같다.
V->M | M->V | M->M |
810.68 | 806.92 | 785.04 |
시간이 줄어든 것은.. Loop가 줄어서 그런듯 하다. -_-
신기한 것은, Z-검정 결과 V->M과 M->V는 차이가 없는 것으로 나오고, (M->V, V->M) vs (M->M)은 차이가 나는 것으로 나왔다. 게다가, 이번경우는 M->M이 더 빠르다!
이러한 실험 결과가 나온 것은, 아마도 Memory BUS와 PCIExpress BUS간의 속도차이가 아닐까라는 생각이 들었다. 용량이 큰 녀석을 한번에 밀어넣으려하니 이런 결과가 나온것은 아닐까라는… (그외 설명할 길이 있다면 조언을 좀..)
BUS속도가 못 버틸 정도의 데이터를 전송하는 것이 아니라면, (즉, 일반적인 메모리 액세스라면) Video Memory를 활용하는 것도 좋을듯 싶다. (참고로 본인이 개발에 사용하는 컴퓨터는 비디오메모리를 10Mb밖에 안쓴다. 1280*1024*4(32bit)해상도에 모니터가 2개이므로..)
하지만, 문제점이 있다면, 대부분의 서버에는 비디오카드가 따로 안달려있을 것 같다. (아님 말고.) 활용 가능하다면 최대한 활용하는게 좋을듯. 🙂