
참고 자료
Understanding C++ Compute Shader Dispatch and RDG in Unreal Engine - Ghislain Girardot
Compute Shader Overview - Microsoft
Compute Shader를 이해하기 위해서는 먼저 GPU가 어떤 방식으로 계산을 수행하는지 이해해야 한다.
GPU는 동일한 연산을 대량의 데이터에 반복적으로 수행하는 작업에 특화되어 있다.
따라서 다음과 같은 작업들은 GPU를 이용한 병렬 계산 방식이 자주 사용된다.
CPU가 복잡한 분기와 순차적인 로직 처리에 강하다면, GPU는 단순한 연산을 매우 많은 데이터에 동시에 수행하는 구조에 최적화되어 있다.
Compute Shader는 이러한 GPU의 병렬 처리 능력을 렌더링 이외의 일반 계산에도 사용할 수 있도록 만든 기능이다.
GPU에서 실행되는 가장 작은 실행 단위를 Thread라고 한다.
Compute Shader는 수많은 Thread를 동시에 실행하여 데이터를 병렬로 처리한다.
일반적으로는하나의 Thread가 하나의 데이터를 처리하는 방식으로 설계하는 경우가 많다.
예를 들어
를 각각 하나의 Thread가 담당하는 방식이다.
GPU는 내부적으로 여러 Thread를 동시에 실행하도록 설계되어 있다. 이때 실행 가능한 Thread 수는 Shader 코드에서 조정할 수 있다.
보통 Compute Shader에서는
같은 단위의 Thread 개수를 자주 사용한다.
이는 GPU 하드웨어가 내부적으로 Warp(Wave) 단위 실행 구조를 사용하기 때문이다.
NVIDIA GPU는 일반적으로 32개의 Thread를 Warp 단위로 처리한다.
AMD GPU는 32 또는 64 단위의 Wavefront 구조를 사용한다.
사용되지 않는 Thread가 많아질 경우 GPU 자원 활용률이 낮아질 수 있다.
이러한 상태를 Low Occupancy라고 한다.
예를 들어 64개의 Thread가 필요한 구조인데 실제 계산에는 40개만 사용된다면 나머지 24개의 Thread는 비활성 상태가 된다.
결과적으로 GPU 연산 효율이 감소할 수 있다.
따라서 Compute Shader에서는 가능한 한 Thread 사용률을 높게 유지하는 것이 중요하다.
참고
Compute Shader에서의 Thread는 CPU의 운영체제 스레드와는 다른 개념이다.
Compute Shader의 Thread는 GPU 내부에서 동작하는 논리적인 실행 단위이다.
(물리적인 하드웨어 구조가 아님을 주의)
GPU의 Thread는 개별적으로만 실행되지 않는다.
여러 개의 Thread를 하나로 묶은 단위를 Thread Group이라고 한다.
HLSL에서는 다음과 같이 선언한다.
[numthreads(8,8,1)]
여기서
을 의미한다.
즉 8 × 8 × 1 = 64개의 Thread가 하나의 Group 안에서 실행된다.
동일한 Group 내부의 Thread들은 Shared Memory를 공유할 수 있으며 그룹 동기화(Group Sync)가 가능하다.
DirectX 11 기준 하나의 Thread Group에는 최대 1024개의 Thread 제한이 존재한다.

Thread Group의 개수를 실제로 실행하도록 요청하는 작업을 Dispatch라고 한다.
Dispatch는 CPU 측에서 호출된다.
Dispatch(X, Y, Z)
여기서 전달하는 값을 통해 몇 개의 Thread Group을 실행할 것인가를 결정한다.
예를 들어,
총 (8 × 64) × (8 × 64) = 512 x 512의 텍스쳐를 한번에 처리가 가능해진다.
전체 실행 구조는 다음과 같이 이해할 수 있다.
