John은 이미 훌륭한 답변을 작성 했으므로이 답변 을 그의 확장이라고 생각하십시오.
나는 현재 다른 알고리즘에 대한 컴퓨팅 쉐이더로 많은 일을하고 있습니다. 일반적으로 컴퓨팅 셰이더는 해당 픽셀 셰이더보다 훨씬 빠르거나 피드백 기반 대안을 변환 할 수 있습니다.
컴퓨팅 셰이더가 작동하는 방식에 대해 머리를 감싸면 많은 경우에 더 의미가 있습니다. 픽셀 셰이더를 사용하여 이미지를 필터링하려면 프레임 버퍼 설정, 정점 보내기, 여러 셰이더 단계 사용 등이 필요합니다. 이미지를 필터링하려면 왜 이것이 필요합니까? 이미지 처리를 위해 전체 화면 쿼드를 렌더링하는 데 익숙해 졌다는 것이 내 의견으로는 계속 사용하는 유일한 "유효한"이유입니다. 컴퓨팅 그래픽스 분야에 새로 온 사람들은 컴퓨팅 셰이더가 텍스처 렌더링보다 이미지 처리에 훨씬 더 자연스럽게 적합 할 것이라고 확신합니다.
귀하의 질문은 특히 이미지 필터링과 관련이 있으므로 다른 주제에 대해서는 자세히 설명하지 않습니다. 일부 테스트에서는 텍스처로 렌더링하기 위해 변환 피드백을 설정하거나 프레임 버퍼 객체를 전환하면 약 0.2ms의 성능 비용이 발생할 수 있습니다. 렌더링은 제외됩니다. 어떤 경우에는 셰이더를 계산하기 위해 정확히 동일한 알고리즘을 포팅하고 성능이 눈에 띄게 향상되었습니다.
컴퓨팅 셰이더를 사용할 때 GPU의 더 많은 실리콘을 사용하여 실제 작업을 수행 할 수 있습니다. 픽셀 셰이더 라우트를 사용할 때는 다음과 같은 추가 단계가 모두 필요합니다.
- 정점 어셈블리 (정점 속성, 정점 제수, 유형 변환, vec4로 확장 등)
- 버텍스 쉐이더는 아무리 작아도 예약이 필요합니다
- 래스터 라이저는 정점 출력을 가리고 보간하기 위해 픽셀 목록을 계산해야합니다 (이미지 처리를위한 텍스처 좌표 만 가능)
- 모든 다른 상태 (깊이 테스트, 알파 테스트, 가위, 혼합)를 설정하고 관리해야합니다.
앞서 언급 한 모든 성능 이점은 스마트 드라이버가 무시할 수 있다고 주장 할 수 있습니다. 당신이 옳을 것입니다. 이러한 드라이버는 심도 테스트 등없이 전체 화면 쿼드를 렌더링하고 있음을 식별하고 픽셀 쉐이더를 지원하기 위해 수행 된 모든 쓸모없는 작업을 건너 뛰는 "빠른 경로"를 구성 할 수 있습니다. 일부 드라이버가 특정 AAA 게임에서 특정 GPU에 대한 사후 처리 패스를 가속화하기 위해이 작업을 수행하더라도 놀라지 않을 것입니다. 물론 AAA 게임을하고 있지 않다면 그러한 치료법을 잊어 버릴 수 있습니다.
그러나 드라이버가 할 수없는 것은 컴퓨팅 셰이더 파이프 라인이 제공하는 더 나은 병렬 처리 기회를 찾는 것입니다. 가우스 필터의 고전적인 예를 들어보십시오. 컴퓨팅 셰이더를 사용하면 다음과 같은 작업을 수행 할 수 있습니다 (필터 분리 여부).
- 각 작업 그룹에 대해 소스 이미지의 샘플링을 작업 그룹 크기로 나누고 결과를 그룹 공유 메모리에 저장하십시오.
- 공유 메모리에 저장된 샘플 결과를 사용하여 필터 출력을 계산하십시오.
- 출력 텍스처에 쓰기
1 단계가 핵심입니다. 픽셀 셰이더 버전에서 소스 이미지는 픽셀 당 여러 번 샘플링됩니다. 계산 셰이더 버전에서 각 소스 텍셀은 작업 그룹 내에서 한 번만 읽습니다. 텍스처 읽기는 일반적으로 타일 기반 캐시를 사용하지만이 캐시는 여전히 공유 메모리보다 훨씬 느립니다.
가우스 필터는 가장 간단한 예 중 하나입니다. 다른 필터링 알고리즘은 공유 메모리를 사용하여 작업 그룹 내에서 중간 결과를 공유 할 수있는 다른 기회를 제공합니다.
그러나 캐치가 있습니다. 컴퓨팅 셰이더는 출력을 동기화하기 위해 명시적인 메모리 장벽이 필요합니다. 잘못된 메모리 액세스로부터 보호 할 수있는 보호 기능도 적습니다. 병렬 프로그래밍 지식이 뛰어난 프로그래머에게는 컴퓨팅 셰이더가 훨씬 더 많은 유연성을 제공합니다. 그러나 이러한 유연성으로 인해 일반 C ++ 코드와 같은 컴퓨팅 셰이더를 처리하고 느리거나 잘못된 코드를 작성하는 것이 더 쉬워집니다.
참고 문헌
- OpenGL 컴퓨팅 셰이더 위키 페이지
- DirectCompute : 최적화 및 모범 사례, Eric Young, NVIDIA Corporation, 2010 [pdf]
- 효율적인 컴퓨팅 쉐이더 프로그램, Bill Bilodeau, AMD, 2011? [pps]
- 게임을위한 DirectCompute – 컴퓨팅 쉐이더, Layla Mah & Stephan Hodes, AMD, 2013, [pps]
- AMD GPU를위한 컴퓨팅 셰이더 최적화 : 병렬 감소, Wolfgang Engel, 2014