본문 바로가기
프로그래밍/컴퓨터

[CS] 컴퓨트 셰이더

by Sik.K 2023. 7. 11.

컴퓨트 셰이더GPU가 CPU의 기능까지 수행할 수 있게 되면서 나타난 개념이다.

 

DirectX11에서 도입되었으며 일반적인 셰이더처럼 HLSL을 사용하여 처리를 할 수 있고, 렌더링 파이프라인과는 동떨어진, 독립된 셰이더이기 때문에 그래픽스 렌더링과는 관계 없이 사용할 수 있다.

 

컴퓨트 셰이더와 비슷한 연산들을 픽셀 셰이더에서 수행했었지만 컴퓨트 셰이더는 픽셀 셰이더에 비해 다음과 같은 이점이 있다.

 

  • 출력할 곳의 리소스를 임의의 위치로 사용 가능
  • 데이터 공유나 스레드 동기화의 매커니즘 설계
  • 지정한 수의 스레드를 명시적으로 구동시켜, 퍼포먼스를 최적화할 수 있음
  • 렌더링 파이프라인과 상관 없으므로 코드의 유지보수가 간단하다.

 

컴퓨트 셰이더는 병렬 처리 작업을 위해 수행 되는 하나 이상의 스레드 그룹(Thread Group)으로 구성되고, 각 스레드 그룹은 작업을 독립적으로 처리하며, 각 스레드는 입력 데이터에 대해 동일한 코드를 실행하여 병렬 처리를 수행한다.

 

 

출처 - [Compute Shader 01] 컴퓨터 쉐이더의 기본 (tistory.com)

 

이처럼 컴퓨트 셰이더는 하나의 작업을 잘게 쪼개어 수행하는 형태로 진행이 되고 보통은 numthread라는 함수로 스레드 그룹을 3차원으로 생성한 다음, dispatch를 통해 작업을 수행한다.

 

하드웨어가 한 그룹의 스레드를 분할하는 단위를 워프라고 하며 하나의 워프에는 총 32개의 워프가 할당이 가능하다.

 

numthread로 설정되는 스레드 그룹에서 그룹당 스레드의 개수는 반드시 워프 크기(32, NVIDIA 카드) 또는 웨이브 프런트 크기(64, AMD 카드)의 배수여야 한다.

 

이때 컴퓨트 셰이더의 호출 총량은 스레드 그룹의 수 * 스레드 그룹의 크기이다.

 


 

보통 이런 컴퓨트 셰이더는 많은 양의 데이터를 비슷한 연산으로 병렬 처리할 때 사용되고, 구성은 다음과 같다.

 

  • 상수 버퍼들을 통한 전역 변수 접근
  • 입력 자원과 출력 자원
  • 스레드 그룹의 구성과 스레드 개수를 지정하는 numthread(X,Y, Z) 특성
  • 각 스레드에서 실행될 명령들을 담은 컴퓨트 셰이더 함수 본문
  • 스레드 식별을 위한 시스템 값 의미소 매개변수

 

하지만 결국 GPU에서 계산을 수행한 것이기 때문에 버퍼에 담기게 되며 이를 CPU로 보내야 한다. 하지만 GPU의 연산 속도가 워낙 높기 때문에 데이터가 이동을 해야 함에도 이를 사용한다.

 

또한 컴퓨트 셰이더에서 작업한 결과물을 렌더링에 사용하는 다른 셰이더의 입력값으로 묶는 것 또한 가능하다.

'프로그래밍 > 컴퓨터' 카테고리의 다른 글

[CS] GPGPU  (0) 2023.07.11
[CS] SIMD(Single Instruction Multiple Data)  (0) 2023.06.19
[CS] 메모리 단편화 & 메모리 풀  (0) 2023.05.04
[CS] 캐시 메모리  (0) 2023.04.20
[CS] 메모리 계층 구조(Memory Hierarchy)  (0) 2023.04.19

댓글