yuchi's Development Home
개인적으로 [CUDA를 이용한 충돌처리 엔진 프로젝트]를 시작한지 어언 두달 가까이 되었다.
현재까지 진행 상황을 간단히 적어본다.
[목표]
1.MMORPG 게임 서버에서 사용할 수 있는 충돌처리 엔진을 구현한다.
2.대규모 처리를 위해서 CUDA를 사용한다.
3.캐릭터와 로켓런쳐 탄환 따위의 동적인 오브젝트는 타원체(가로세로 1:1이면 구)로, 게임맵은 삼각형집합으로 구현한다.
4. 타원테 VS 타원체 , 타원체 VS 삼각형의 충돌을 감지하고 탄성계수를 적용한 반사, 또는 미끄러짐을 구현한다.
History
1. 1차 버젼
CPU 코드 - 싱글 스레드 ,공간분할 자료구조 없음
GPU 코드 - 공간분할 구조 없음
퍼포먼스 비교 : CPU(100%) < GPU(1000%)
비고 : 작동은 하지만 수천개 이상의 삼각형 데이타를 넣으면 거의 무한루프에 빠지는 정도로 느림.
실제로 타임아웃으로 커널함수 크래시
공간분할 필수라는 것을 새삼 뼈저리게 느낌.
일단 10배 빨랐으므로 CUDA충돌처리의 가능성을 보았다 하겠다.
2. 2차 버젼
CPU 코드 - 멀티 스레드(HT포함 모든 논리적 코어 사용), BSP트리
GPU 코드 - 계산코드는 1차버젼과 동일.
CPU코드로 BSP 트리를 탐색하여 인접한 삼각형과 타원체를 CUDA 커널에 전달하는 방식
퍼포먼스 비교 : CPU(100%) < GPU(120%)
비고 : 충돌처리 소요시간 = 인접한 타원체와 삼각형 검색 시간(50%) + 실제 충돌처리 계산 시간(50%)
인데 타원체와 삼각형 검색을 cpu에 의존하므로 GPU에서의 퍼포먼스 향상 여지가 너무 적음.
코드 상으론 가장 깔끔하고 유지보수 용이.
10000개 이상의 삼각형 4000개의 타원체에 대한 충돌처리를 무사히 할 수 있음.
일단 실제 게임에 적용할 수 있는 최소한의 조건은 갖췄다는 정도의 의의.
3. 3차버젼
CPU 코드 - 2차버젼과 동일
GPU 코드 - CUDA 디바이스 메모리에서 돌아가는 3차원 그리드 구조.
퍼포먼스 비교 - CPU(100%) < GPU(800%)
비고 : 과도한 메모리 사용으로 전체 타원체 개수가 증가하면 PCI 버스의 부담으로 이어짐. 그에 따라 퍼포먼스 감소.
기본 사용 메모리를 줄이자니 한번에 충돌처리 가능한 타원체 개수를 줄여야 하는 상황.
다른 자료 구조를 고려함.
4. 4차버젼
CPU 코드 - 2차버젼과 동일
GPU 코드 - CUDA 디바이스 메모리에서 돌아가는 BSP트리
퍼포먼스 비교 : CPU (100%) > GPU(30%)
비고 : 현재까지 버젼중 가장 복잡한 자료구조를 가짐.
트리구조를 CUDA디바이스에서 갱신하기 위해 3패스 커널함수 호출.
트리 탐색에서 심각하게 퍼포먼스 저하.
GPU 메모리로의 전송량을 줄일 수 있는 아이디어는 얻음.
5. 현재버젼
CPU 코드 - 2차버젼과 동일
GPU 코드 - 3차버젼을 베이스로 해서 자료구조 재설계.
3차원 그리드 구조이나 동적인 타원체의 링크 정보를 갱신하기 위한 별도의 포인터 테이블 사용.
타원체와 삼각형 탐색시 약간의 추가적인 조건 추가.
GPU메모리로의 데이타 전송량 최소.
퍼포먼스 비교 : CPU (100%) < GPU (8000% ~ )
비고 : 현재까지 버젼중 가장 빠름. 교훈-CUDA스레드가 하는 작업은 최대한 단순한 코드로 구현해야한다.
안정성을 위한 장치를 추가하고 메모리 억세스 방식에서 퍼포먼스 향상을 연구해야함.
마지막 버젼의 퍼포먼스 테스트 결과는 다음과 같다.
화면 렌더링의 부하로 정확한 결과를 측정하기 어렵기 때문에 수치 데이타는 화면 렌더링을 off했을때의 기준으로 작성하였다.
[테스트 장비]
CPU : intel i7 2600K (O.C :1 Core ->4.2Ghz, 4 Core -> 3.7GHz)
GPU : nVidia GTX460 1GB (48 SP * 7 = 336 SP)
nVidia GTS450 512MB (48 SP * 4 = 192 SP)
[테스트 모델 ]
맵 삼각형 : 11085개
상호 충돌하는 움직이는 타원체 : 약 2000개
[측정결과]
소요시간(ms) | 소요 클럭(x1000 Clocks) | CPU 점유율 | GPU 점유율 | 성능비교 | |
CPU (8스레드) | 78 | 273000 | 80% | X | 100% |
GTS450 | 0 | 2900 | 17% | 약70% | 9400% |
GTX460 | 0 | 1600 | 16% | 약50% | 17000% |
[스크린 샷]
CPU
GTS450
GTX460