이미지 필터링에서 계산 셰이더가 픽셀 셰이더보다 언제 더 효율적입니까?


37

블러, SSAO, 블룸 등과 같은 이미지 필터링 작업은 일반적으로 픽셀 쉐이더 및 "수집"작업을 사용하여 수행됩니다. 여기서 각 픽셀 쉐이더 호출은 인접한 픽셀 값에 액세스하기 위해 많은 텍스처 페치를 발행하고 단일 픽셀의 가치를 계산합니다. 결과. 이 접근 방식은 많은 중복 페치가 수행된다는 이론적 인 비 효율성을 가지고 있습니다.

이를 수행하는 또 다른 방법은 컴퓨팅 셰이더를 사용하는 것입니다. 이들은 셰이더 호출 그룹에서 적은 양의 메모리를 공유 할 수 있다는 잠재적 이점이 있습니다. 예를 들어, 각 호출에서 하나의 텍셀을 가져 와서 공유 메모리에 저장 한 다음 결과를 계산할 수 있습니다. 이것은 빠를 수도 있고 아닐 수도 있습니다.

문제는 컴퓨팅 셰이더 방법 이 픽셀 쉐이더 방법보다 실제로 어떤 상황에서 (있는 경우) ? 커널의 크기, 어떤 종류의 필터링 작업 등에 의존합니까? 분명히 대답은 GPU 모델마다 다를 수 있지만 일반적인 추세가 있는지 듣고 싶습니다.


컴퓨 트 쉐이더가 올바르게 수행 되면 대답은 "항상"이라고 생각합니다 . 이것은 달성하기 쉽지 않습니다. 계산 셰이더는 이미지 처리 알고리즘에서 개념적으로 픽셀 셰이더보다 더 적합합니다. 그러나 픽셀 쉐이더는 성능이 좋지 않은 필터를 작성하는 데 필요한 여유가 적습니다.
bernie

@bernie 컴퓨 트 셰이더가 "올바로 완료"되기 위해 무엇이 필요한지 명확히 할 수 있습니까? 답을 쓰시겠습니까? 주제에 대해 더 많은 관점을 얻으려면 항상 좋습니다. :)
Nathan Reed

2
이제 네가 한 짓을 봐! :)
bernie

스레드간에 작업을 공유하는 것 외에도 비동기 컴퓨팅을 사용하는 기능은 컴퓨팅 셰이더를 사용하는 큰 이유 중 하나입니다.
JarkkoL

답변:


23

이미지 처리를위한 컴퓨팅 셰이더 의 아키텍처 이점ROP 단계 를 건너 뛰는 것 입니다. 픽셀 쉐이더의 쓰기는 사용하지 않더라도 모든 일반적인 혼합 하드웨어를 통과 할 가능성이 큽니다. 일반적으로 말하면 컴퓨팅 셰이더는 메모리에 대한 다른 경로 (보다 직접적인 경로)를 거치므로 다른 병목 현상을 피할 수 있습니다. 나는 이것으로 인한 상당히 큰 성능의 승리에 대해 들었습니다.

컴퓨팅 셰이더 의 구조적 단점 은 GPU가 더 이상 어떤 작업 항목이 어떤 픽셀로 폐기되는지 알 수 없다는 것입니다. 픽셀 쉐이딩 파이프 라인을 사용하는 경우, GPU는 메모리에 인접한 렌더 타겟 영역에 쓰는 워프 / 웨이브 프론트에 작업을 압축 할 수 있습니다 ( Z- 오일 타일 또는 성능과 유사한 것). 원인). 컴퓨팅 파이프 라인을 사용하는 경우 GPU가 더 이상 최적의 배치에서 작동하지 않아 더 많은 대역폭을 사용할 수 있습니다.

그러나 특정 작업에 관련 작업을 동일한 스레드 그룹으로 패킹하여 악용 할 수있는 하위 구조가있는 경우 변경된 워프 / 파면 포장을 다시 이점으로 전환 할 수 있습니다. 말했듯이 이론적으로 레인 당 하나의 값을 샘플링하고 다른 레인이 샘플링없이 액세스 할 수 있도록 그룹 공유 메모리에 결과를 넣어 샘플링 하드웨어에 중단을 줄 수 있습니다. 이것이 승리인지 여부는 그룹 공유 메모리의 가격에 달려 있습니다. 최저 수준의 텍스처 캐시보다 저렴하다면 이것이 승리 일 수는 있지만 보장 할 수는 없습니다. GPU는 (필요에 따라) 높은 로컬 텍스처 가져 오기를 이미 잘 처리합니다.

작업에서 결과를 공유하려는 중간 단계가있는 경우 그룹 공유 메모리를 사용하는 것이 더 합리적 일 수 있습니다 (실제로 중간 결과를 메모리에 기록하지 않고 텍스처 샘플링 하드웨어를 사용할 수 없기 때문에). 불행히도 다른 스레드 그룹의 결과에 의존 할 수 없으므로 두 번째 단계는 동일한 타일에서 사용할 수있는 것만으로 제한해야합니다. 여기서 일반적인 예는 자동 노출에 대한 화면의 평균 휘도를 계산하는 것입니다. 텍스처 업 샘플링을 다른 작업과 결합하는 것을 상상할 수 있습니다 (다운 샘플링 및 블러와 달리 업 샘플링은 주어진 타일 외부의 값에 의존하지 않기 때문에).


블렌딩을 사용하지 않으면 ROP가 성능 오버 헤드를 추가한다고 의심합니다.
GroverManheim

@GroverManheim 아키텍처에 따라 다릅니다! 블렌딩이 비활성화 된 경우에도 출력 병합 / ROP 단계는 순서 보장을 처리해야합니다. 전체 화면 삼각형을 사용하면 실제 주문 위험이 없지만 하드웨어가이를 알지 못할 수 있습니다. 하드웨어에는 특별한 빠른 경로가있을 수 있지만 자격이 있는지 확실히 알고 있다면…
John Calsbeek

10

John은 이미 훌륭한 답변을 작성 했으므로이 답변 을 그의 확장이라고 생각하십시오.

나는 현재 다른 알고리즘에 대한 컴퓨팅 쉐이더로 많은 일을하고 있습니다. 일반적으로 컴퓨팅 셰이더는 해당 픽셀 셰이더보다 훨씬 빠르거나 피드백 기반 대안을 변환 할 수 있습니다.

컴퓨팅 셰이더가 작동하는 방식에 대해 머리를 감싸면 많은 경우에 더 의미가 있습니다. 픽셀 셰이더를 사용하여 이미지를 필터링하려면 프레임 버퍼 설정, 정점 보내기, 여러 셰이더 단계 사용 등이 필요합니다. 이미지를 필터링하려면 왜 이것이 필요합니까? 이미지 처리를 위해 전체 화면 쿼드를 렌더링하는 데 익숙해 졌다는 것이 내 의견으로는 계속 사용하는 유일한 "유효한"이유입니다. 컴퓨팅 그래픽스 분야에 새로 온 사람들은 컴퓨팅 셰이더가 텍스처 렌더링보다 이미지 처리에 훨씬 더 자연스럽게 적합 할 것이라고 확신합니다.

귀하의 질문은 특히 이미지 필터링과 관련이 있으므로 다른 주제에 대해서는 자세히 설명하지 않습니다. 일부 테스트에서는 텍스처로 렌더링하기 위해 변환 피드백을 설정하거나 프레임 버퍼 객체를 전환하면 약 0.2ms의 성능 비용이 발생할 수 있습니다. 렌더링은 제외됩니다. 어떤 경우에는 셰이더를 계산하기 위해 정확히 동일한 알고리즘을 포팅하고 성능이 눈에 띄게 향상되었습니다.

컴퓨팅 셰이더를 사용할 때 GPU의 더 많은 실리콘을 사용하여 실제 작업을 수행 할 수 있습니다. 픽셀 셰이더 라우트를 사용할 때는 다음과 같은 추가 단계가 모두 필요합니다.

  • 정점 어셈블리 (정점 속성, 정점 제수, 유형 변환, vec4로 확장 등)
  • 버텍스 쉐이더는 아무리 작아도 예약이 필요합니다
  • 래스터 라이저는 정점 출력을 가리고 보간하기 위해 픽셀 목록을 계산해야합니다 (이미지 처리를위한 텍스처 좌표 만 가능)
  • 모든 다른 상태 (깊이 테스트, 알파 테스트, 가위, 혼합)를 설정하고 관리해야합니다.

앞서 언급 한 모든 성능 이점은 스마트 드라이버가 무시할 수 있다고 주장 할 수 있습니다. 당신이 옳을 것입니다. 이러한 드라이버는 심도 테스트 등없이 전체 화면 쿼드를 렌더링하고 있음을 식별하고 픽셀 쉐이더를 지원하기 위해 수행 된 모든 쓸모없는 작업을 건너 뛰는 "빠른 경로"를 구성 할 수 있습니다. 일부 드라이버가 특정 AAA 게임에서 특정 GPU에 대한 사후 처리 패스를 가속화하기 위해이 작업을 수행하더라도 놀라지 않을 것입니다. 물론 AAA 게임을하고 있지 않다면 그러한 치료법을 잊어 버릴 수 있습니다.

그러나 드라이버가 할 수없는 것은 컴퓨팅 셰이더 파이프 라인이 제공하는 더 나은 병렬 처리 기회를 찾는 것입니다. 가우스 필터의 고전적인 예를 들어보십시오. 컴퓨팅 셰이더를 사용하면 다음과 같은 작업을 수행 할 수 있습니다 (필터 분리 여부).

  1. 각 작업 그룹에 대해 소스 이미지의 샘플링을 작업 그룹 크기로 나누고 결과를 그룹 공유 메모리에 저장하십시오.
  2. 공유 메모리에 저장된 샘플 결과를 사용하여 필터 출력을 계산하십시오.
  3. 출력 텍스처에 쓰기

1 단계가 핵심입니다. 픽셀 셰이더 버전에서 소스 이미지는 픽셀 당 여러 번 샘플링됩니다. 계산 셰이더 버전에서 각 소스 텍셀은 작업 그룹 내에서 한 번만 읽습니다. 텍스처 읽기는 일반적으로 타일 기반 캐시를 사용하지만이 캐시는 여전히 공유 메모리보다 훨씬 느립니다.

가우스 필터는 가장 간단한 예 중 하나입니다. 다른 필터링 알고리즘은 공유 메모리를 사용하여 작업 그룹 내에서 중간 결과를 공유 할 수있는 다른 기회를 제공합니다.

그러나 캐치가 있습니다. 컴퓨팅 셰이더는 출력을 동기화하기 위해 명시적인 메모리 장벽이 필요합니다. 잘못된 메모리 액세스로부터 보호 할 수있는 보호 기능도 적습니다. 병렬 프로그래밍 지식이 뛰어난 프로그래머에게는 컴퓨팅 셰이더가 훨씬 더 많은 유연성을 제공합니다. 그러나 이러한 유연성으로 인해 일반 C ++ 코드와 같은 컴퓨팅 셰이더를 처리하고 느리거나 잘못된 코드를 작성하는 것이 더 쉬워집니다.

참고 문헌


3

나는이 블로그에서 우연히 만났다 : AMD를위한 컴퓨팅 쉐이더 최적화

컴퓨팅 셰이더 (컴퓨 트 셰이더에만 해당)에서 수행 할 수있는 트릭을 감안할 때 컴퓨팅 셰이더의 병렬 축소가 픽셀 셰이더보다 빠르면 궁금했습니다. 필자 인 Wolf Engel에게 픽셀 쉐이더를 사용해 보았는지 이메일을 보냈다. 그는 블로그 게시물을 작성할 때 컴퓨팅 셰이더 버전이 픽셀 셰이더 버전보다 훨씬 빠르다고 대답했다. 그는 또한 오늘 차이가 훨씬 더 크다고 덧붙였다. 따라서 컴퓨팅 셰이더를 사용하는 것이 큰 이점이있는 경우가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.