서의 공간

제12장 계산 셰이더 본문

Graphics API/DirectX 11 - Luna

제12장 계산 셰이더

홍서의 2020. 12. 23. 07:10

GPU는 하나의 장소 또는 연속된 장소들에서 대량의 메모리를 읽어서 처리하는 작업(소위 '스트리밍 연산')에 최적화되어 있다. 이는 임의 메모리 접근을 염두에 두고 설계된 CPU와 대조적인 특징이다. 게대가 정점들과 픽셀들이 개별적으로 처리된다는 특징 때문에 GPU는 대규모 병렬 처리에 맞게 설계되었다. 

이러한 GPU 아키텍처가 그래픽 연산에 도움이 됨은 분명하다. 그러니 GPU의 병렬 아키텍처와 대량 자료 처리 능력을 활용할 수 있는 분야가 그래픽만은 아니다. GPU를 비그래픽 분야에 응용하는 것이 범용 GPU(general purpose GPU, GPGPU) 프로그래밍이라고 부른다. 모든 알고리즘이 GPU 구현에 적합한 것은 아니다. GPU의 병렬 아키텍처의 장점을 취하려면 알고리즘이 자료 병렬성을 가지고 있어야 한다. 다른 말로 하면, 많은 양의 자료 원소들에 비슷한 연산을 적용함으로써 원소들을 병렬로 처리할 수 있어야 한다.

일반적으로 GPGPU 프로그래밍에서는 CPU에서 계산 결과에 접근할 필요가 있는데, 이를 위해서는 비디오 메모리에 담긴 결과를 시스템 메모리에 복사해야 한다(그림 12.1). 그러나 계산을 GPU에서 수행해서 얻는 속도 향상을 생각한다면 이러한 복사에 따른 추가부담은 무시할 수 있다. 그래픽의 경우에는 일반적으로 계산 결과를 렌더링 파이프라인의 입력으로 사용하므로 GPU에서 CPU로의 자료 전송이 필요하지 않다. 예를 들어 계산 셰이더에서 텍스처를 흐린 다음, 흐려진 텍스처에 대한 셰이더 자원 뷰를 한 셰이더의 입력으로 묶으면 된다.

계산 셰이더(compute shader)는 Direct3D가 제공하는 프로그램 가능 셰이더의 하나로, 사실 렌더링 파이프라인에 직접 포함되어 있는 것이 아니라 파이프라인 옆에 따로 존재한다. 그러나 GPU 자원에서 직접 자료를 읽거나 자료를 기록할 수 있다(그림 12.2). 본질적으로 계산 셰이더는 아무 것도 그리지 않으면서도 GPU에 직접 접근함으로써 자료 병렬적 알고리즘을 구현할 수 있는 수단을 제공한다. 앞에서 언급했듯이 이는 GPGPU 프로그래밍에 유용하다. 그러나 계산 셰이더로 구현할 수 있는 그래픽 효과들도 여전히 많다. 

[그림 12.1] CPU와 RAM, CPU와 GPU, GPU와 RAM, GPU와 VRAM의 상대적인 메모리 대역폭 속도를 나타낸 도식. 이 수치들은 단지 대역폭들의 차이가 몇 자릿수 정도인지를 보여주기 위한 것일 뿐이다. CPU와 GPU 사이의 메모리 전송이 병목임을 주목하라.
[그림 12.2] 계산 셰이더는 렌더링 파이프라인의 일부가 아니고 그 옆에 존재한다. 계산 셰이더는 GPU 자원을 읽고 쓸 수 있다. 계산 셰이더를 그래픽 렌더링과 함께 사용할 수도 있고 GPGPU 프로그래밍에서만 사용할 수도 있다.

목표

1. 계산 셰이더 프로그램을 작성하는 방법을 배운다.

2. 하드웨어가 스레드 그룹 및 그룹 안의 스레드들을 처리하는 방법을 개괄적으로 이해한다.

3. 계산 셰이더의 입력으로 설정할 수 있는 Direct3D 자원의 종류와 계산 셰이더의 출력으로 설정할 수 있는 Direct3D 자원의 종류를 파악한다.

4. 여러 종류의 스레드 ID와 그 용도를 이해한다.

5. 공유 메모리 및 그것을 이용한 성능 최적화 방법을 배운다.

6. GPGPU 프로그래밍에 대한 좀 더 자세한 정보를 얻을 수 있는 곳들을 살펴본다.

12.1 스레드와 스레드 그룹

 

'Graphics API > DirectX 11 - Luna' 카테고리의 다른 글

제18장 노멀 매핑과 변위 매핑  (0) 2020.12.23
제11장 기하 셰이더  (0) 2020.12.23
제10장 스텐실 적용  (0) 2020.12.23
제9장 혼합  (0) 2020.12.23
제8장 텍스처 적용  (0) 2020.12.22
Comments