Article Summary
해당 프로젝트는 CUDA SoftwareRenderer 에서 이어지는 내용이며 기존의 CUDA 소프트웨어 렌더러 프로젝트에서의 래스터라이저 성능 개선을 중점적으로 이야기 합니다.
Conclusions
타일 기반 래스터화의 목적은 기존의 스캔라인 방식의 래스터라이저에서 픽셀당 스레드 배치가 어려운 이유로 래스터라이제이션 파이프라인의 전반적인 개선이 필요하기 때문이었습니다.
해당 최적화 작업을 통해 얻은 사실들과 개선점에 대해 이야기합니다.
Facts
- 타일에 포함된 삼각형의 수에 따라 성능에 큰 영향을 받음.
- 스캔라인 래스터라이저와 달리 래스터화 시 반복문 의존도를 크게 줄일 수 있었음.
- 최악의 경우 $O(nm)$ 또는 $O(n^{2})$
- 후면 제거 또는 프러스텀 컬링이 동반되지 않는 경우 성능에 치명적인 악영향을 받음.
- 타일에 삼각형을 추가하는 방식과 조건에 따라 성능에 큰 영향을 받음.
- 일반적으로 먼 거리에 위치한 메쉬를 렌더할 경우 병목이 심해짐.
- 반대로 가까운 거리에 대해 유리함.
Possible Improvements
- 프러스텀 컬링, 후면 제거와 같은 작업을 타일에 삼각형을 등록하는 단계에서 진행하면 래스터화 단계에서 더 높은 성능 향상을 기대할 수 있을 것으로 보임.
- 행렬 또는 해상도와 같은 호스트 (애플리케이션) 로부터 넘어오는 정보들을 DX의 상수버퍼와 같은 개념으로 한 번에 전달하여 Bandwidth, 레지스터 사용량을 크게 감소시킬 수 있을 것으로 보임.
- 타일에 삼각형을 등록하는 이중 반복문 구조 전체를 병렬화할 시 상당한 성능 향상이 기대됨 $O(nm) \rarr O(1)$
Benchmark
- AMD Ryzen 5 3600 6-core processor (12 CPUs) ~ 3.6 GHz
- RTX 3060, CC 8.6, 64 registers used