Simon Schreibt의 "Render Hell – Book II"에서는 GPU 렌더링 파이프라인의 내부 구조와 병렬 처리 방식에 대해 심도 있게 다루고 있습니다. 주요 내용은 다음과 같습니다
1. GPU 코어의 역할 분담
GPU는 수많은 작은 코어로 구성되어 있으며, 각 코어는 주로 픽셀과 정점의 계산을 담당합니다. 그러나 테셀레이션, 컬링, 프래그먼트 준비, 깊이 테스트, 프레임 버퍼에 픽셀 쓰기 등과 같은 작업은 전용 하드웨어 블록에서 처리됩니다. 이러한 분업화는 GPU의 효율성을 높이는 데 기여합니다.
2. 병렬 파이프라인의 존재
GPU는 여러 개의 **스트리밍 멀티프로세서(Streaming Multiprocessor)**를 통해 동시에 여러 셰이더 스트림을 처리할 수 있습니다. 이는 서로 다른 픽셀 셰이더나 정점 셰이더를 병렬로 실행하여 작업 효율을 극대화합니다.
3. 렌더링 파이프라인 단계별 상세 분석
- 애플리케이션 단계: 애플리케이션이나 게임이 드라이버에게 렌더링 명령을 전달합니다.
- 드라이버 단계: 드라이버는 명령을 **커맨드 버퍼(Command Buffer)**에 저장하고, 이후 GPU로 전송합니다.
- 명령 읽기: GPU의 호스트 인터페이스가 명령을 읽어들여 처리 준비를 합니다.
- 데이터 페치: GPU는 전용 엔진을 통해 RAM에서 VRAM으로 데이터를 복사합니다. 여기에는 정점 버퍼, 텍스처, 셰이더 파라미터 등이 포함됩니다.
- 정점 페치: 스트리밍 멀티프로세서 내의 **폴리모프 엔진(Polymorph Engine)**이 필요한 데이터를 캐시에 로드하여 코어들이 빠르게 접근할 수 있도록 합니다.
- 셰이더 실행: 스트리밍 멀티프로세서는 받은 **스레드 블록(Thread Block)**을 **워프(Warp)**로 분할하고, 각 워프는 32개의 스레드로 구성되어 코어에서 병렬로 실행됩니다. 모든 코어는 동일한 명령을 동시에 수행하며, 이는 락스텝(lock-step) 방식으로 알려져 있습니다.
이러한 구조와 과정은 GPU가 복잡한 그래픽 작업을 효율적으로 처리할 수 있게 하며, 다양한 작업 부하에 유연하게 대응할 수 있도록 합니다.