컴퓨팅 셰이더와 파이프 라인 셰이더를 통한 알고리즘 구현


10

DirectX 및 OpenGL 모두에 컴퓨팅 쉐이더를 사용할 수 있으므로 이제 래스터 화 파이프 라인을 거치지 않고도 많은 알고리즘을 구현할 수 있으며 대신 GPU에서 범용 컴퓨팅을 사용하여 문제를 해결할 수 있습니다.

일부 알고리즘의 경우 이것은 기본적으로 래스터 화 기반이 아니기 때문에 직관적 인 정식 솔루션이되는 것 같습니다. 래스터 화 기반 셰이더는 GPU 성능을 활용하는 해결 방법 인 것처럼 보입니다 (간단한 예 : 노이즈 텍스처 생성) 여기에서 쿼드를 래스터화할 필요가 없습니다. ).

두 가지 방법으로 구현할 수있는 알고리즘이 주어지면 컴퓨팅 셰이더를 사용하는 것과 일반 경로를 사용하는 것보다 일반적인 (잠재적) 성능 이점이 있습니까? 주의해야 할 단점이 있습니까 (예를 들어, 런타임에 컴퓨팅 셰이더에서 컴퓨팅 셰이더로 전환 할 때 발생하는 비정상적인 오버 헤드가 있습니까?)

두 가지 중에서 선택할 때 고려해야 할 다른 이점이나 단점이 있습니까?


성능 태그가 실제로 관련이있는 경우 Marco Fratarcangeli의 Game Engine Gems "천장 시뮬레이션"기사 ( youtube.com/watch?v=anNClcux4JQ) 에서이 비디오를 시청 해보십시오 . GLSL / 쉐이더 기반 구현은 CUDA 또는 OpenCL을 사용하는 것보다 빠릅니다 (2010 년 당시 드라이버 지원 부족으로 인해 후자). 저수준의 차이가 있습니다 ...
teodron

@teodron GPU Gems를 사용할 수 없어 소스 코드를 찾을 수 없습니다. 저자는 실제로 GLSL 정점 + 픽셀 쉐이더를 사용 했습니까, 아니면 GLSL 계산 쉐이더를 사용 했습니까?
TravisG

예! CUDA 이전에는 커뮤니티가 GPGPU 기능을 구현 한 방식입니다. 다음은 순수 GLSL 또는 Cuda를 사용하여 어떻게 달성 할 수 있는지 보여주는 OpenCloth 링크입니다 : code.google.com/p/opencloth/source/browse/trunk/…
teodron

답변:


7

컴퓨 트 셰이더 / GPGPU 접근 방식의 이점을 직접 누리려면 정답이 없습니다. 구현하는 알고리즘의 유형에 따라 크게 달라지며 컴퓨 트 셰이더 및 CUDA / OpenCL은 일부 제한 사항을 극복하기위한보다 일반적인 접근 방식입니다. 그 오래된 음영 언어의 해킹. 가장 중요한 혜택 :

  • 공간 정보에 액세스 오래된 GLSL 핵 (물론 핵이었습니다!)에서는 텍스처 좌표를 사용하기 때문에 이웃 프래그먼트에 대한 정보는 거의 제공하지 않습니다. 공간 정보에 액세스하는 컴퓨팅 셰이더 / CUDA / OpenCL에서 훨씬 더 융통성있게 정렬 된 텍스처 / 버퍼 액세스로 GPU에서 히스토그램 등화 알고리즘을 구현할 수 있습니다.
  • 스레드 동기화 및 원자를 제공합니다 .
  • 계산 공간 : 기존 GLSL 핵은 정점 / 조각 계산 공간을 셰이더에 연결합니다. 프래그먼트 셰이더는 프래그먼트 수만큼 실행되고 정점 셰이더는 버텍스 수로 실행됩니다. 컴퓨 트 셰이더에서는 자신 만의 공간을 정의합니다.
  • 확장 성 : 컴퓨팅 셰이더 / CUDA / OpenCL은 동일한 SM에서 실행되어야하는 기존 GLSL 셰이더와 달리 사용 가능한 GPU SM (Streaming Multiprocessor) 수까지 확장 할 수 있습니다. (Nathan Reed의 의견에 따르면 그는 사실이 아니며 쉐이더는 컴퓨팅 쉐이더만큼 확장해야한다고 말합니다. 설명서를 확인해야하지만 확실하지 않습니다).
  • 컨텍스트 전환 : 컨텍스트 전환 이 필요하지만 애플리케이션에 따라 다르므로 애플리케이션을 프로파일 링하는 것이 가장 좋습니다.

음에 내 의견으로는 특정 알고리즘이 더 적합 할 수있다하더라도, 컴퓨팅 쉐이더의 경로를 이동하려는 경우, 당신이 고려해야 할 특정 고려 사항이 있습니다 :

  1. 하드웨어 및 이전 버전과의 호환성 . 컴퓨 트 셰이더는 최신 하드웨어에서만 사용할 수 있으며 상용 제품 (예 : 게임)을 사용하려는 경우 많은 사용자가 제품을 실행할 수 없을 것으로 예상해야합니다.
  2. 당신은 일반적으로 별도의 GPU 지식 / CPU 아키텍처를 필요 는 것을, 병렬 프로그래밍과 멀티 스레딩 (예를 들어, 메모리 공유, 메모리 일관성, 스레드 동기화, 아토와 성능에 그것의 효과) 일반적으로 사용하지 않아도 정상 쉐이더 rounte합니다.
  3. 학습 리소스 , 경험상 일반적인 쉐이더 경로보다 Compute shadrs, OpenCL 및 CUDA (OpenGL 상호 운용성 제공)에 대한 학습 리소스가 훨씬 적습니다.
  4. 적절한 디버깅이 없으면 디버깅 도구 는 대부분의 셰이더보다 툴 개발이 훨씬 어려워 질 수 있으며, 적어도 셰이더는 시각적으로 디버깅 될 수 있습니다.
  5. 컴퓨팅 셰이더가 다른 셰이더의 동일한 알고리즘보다 더 나은 성능을 제공 할 것으로 기대합니다. 그래픽 렌더링을위한 추가 단계를 피하도록 설계 되었기 때문에 2 단계부터 올바르게 고려한 경우 . 그러나 나는 나의 주장을 뒷받침 할 구체적인 증거가 없다.
  6. 해당 경로로가는 경우 GPGPU에 대한 CUUDA / OpenCL도 고려해야합니다.

나는 그것이 미래를 위해 위대하다고 확신하며, 훌륭한 학습 경험이 될 것입니다. 행운을 빕니다!


OP가 이것을 묻고 있다고 생각합니다. 왜 순수한 GLSL 쉐이더를 사용하여 CUDA로 코딩하는 것보다 문제를 해결합니까? 저자가 그렇게하는 천 시뮬레이션에 관한 Game Programming Gems 기사가 있습니다. GLSL 해키 올드 방식은 성능 측면에서 CUDA 방식보다 낫습니다. 왜 그런지 아는 경우 왜 지적해야합니다.
teodron

2
확장 점이 정확하다고 생각하지 않습니다. 꼭짓점 및 조각 셰이더는 컴퓨팅 셰이더와 마찬가지로 전체 GPU에서 스케일링 할 수 있습니다. 스레드 그룹 크기 및 공유 메모리 사용량으로 인해 한 번에 몇 개의 셰이더 스레드를 실행할 수 있는지에 대한 추가 제한이있을 수 있으므로 실제로 계산 셰이더를 확장하기가 더 어려울 수 있습니다.
Nathan Reed

2
또한 텍스처를 채우는 경우 (예 : 노이즈 생성 또는 다른 절차 알고리즘 수행) 경험상 각 픽셀에서 수식을 평가하는 경우 조각 셰이더가 계산 셰이더보다 빠릅니다. 내 생각에 이것은 조각 순서가 내부 타일 / 스위 즐링 된 픽셀 순서와 일치하기 때문에이 순서를 모르는 컴퓨팅 셰이더보다 더 나은 메모리 지역성을 얻기 때문입니다. 컴퓨 트 셰이더는 공유 메모리와 같은 특수 기능을 사용하여 프래그먼트 셰이더에 비해 속도를 크게 높일 수있는 경우에만 더 빠릅니다.
Nathan Reed

2
마지막 코멘트. :) 대부분의 최신 GPU에는 그래픽에서 컴퓨팅으로 또는 그 반대로 갈 때 일종의 컨텍스트 스위치 또는 모드 스위치가 있다고 생각합니다. 따라서 일부 그래픽 셰이더를 실행 한 다음 컴퓨팅 셰이더를 디스패치 한 다음 더 많은 그래픽 셰이더 등을 실행하면 앞뒤로 전환 할 때 성능이 저하 될 수 있습니다. 그것은 프로파일해야 할 것이지만 특정 경우 그래픽 셰이더를 고수하는 또 다른 이유 일 수 있습니다.
Nathan Reed

@NathanReed 의견을 보내 주셔서 감사합니다. 답변을 업데이트하겠습니다.
concept3d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.