TECHARTNOMAD | TECHARTFLOWIO.COM

TECH.ART.FLOW.IO

[번역] Bindless Resources Notes

jplee 2024. 7. 30. 12:30

역자의 말: 이틀 전에 게시 된 언리얼페스트2024의 멋진 초콜릿 강연을 봤습니다. 바인드리스 텍스처에 대한 이해를 돕기 위해 팀 내부에서도 2주 간 추가 리서치를 하고 멀티플레폼에서 우리가 얻을 이점이 정확히 무엇인지 파악하고자 하는데요... 그 전에 간략히 Wong 씨가 요약한 내용을 동시에 재게시 해 봅니다.
애픽게임즈 로드맵.


저자 : 玄冬Wong
keywords: Direct3D 12, D3D12, Vulkan, Bindless, Texture and Buffer, DescriptorSet, Descriptor Set Layout, Descriptor Indexing

요약

장점
배열 텍스처(슬롯 기반)와 바인드리스 텍스처의 차이점:
배열 텍스처는 일반적으로 배열의 모든 텍스처가 동일한 형식과 치수를 사용해야 한다는 사실에 의해 제한을 받습니다. 바인드리스 텍스처는 크기와 형식이 독립적이지만 셰이더에서 직접 액세스할 수 있으며 셰이더에서 활성화하기 위해 CPU 측 바인드 호출이 필요하지 않습니다.
 인용: How are bindless resources different from slot-based resources
바인드리스 디스크립터의 장점:
바인드리스 디자인은 CPU가 훨씬 적은 작업을 수행해야 하기 때문에 CPU 쪽에서 훨씬 빠르게 작업할 수 있으며, 각 드로콜이 "더 큰" 만큼 GPU도 더 잘 활용하기 때문에 더 빠르게 작업할 수 있습니다. 최신 GPU는 매우 크고 램프업/램프다운 시간이 길기 때문에 씬 렌더링에 사용하는 드로우콜 수가 적을수록 좋습니다.
인용 GPU Driven Rendering Overview
최적화
인용 Intel® Processor Graphics Xᵉ-LP API Developer and Optimization Guide:
최신 그래픽 API를 사용하면 DirectX 루트 서명 및 Vulkan* 파이프라인 레이아웃과 같은 리소스 바인딩을 더 잘 제어할 수 있습니다. 이러한 기능을 사용하려면 성능을 극대화하기 위해 각별한 주의가 필요합니다. 리소스 바인딩을 위한 애플리케이션 전략을 설계할 때는 다음 지침을 따르세요:
 

  • 루트 시그니처 슬롯 또는 디스크립터 세트의 수를 셰이더에서 사용할 만큼만 최소화합니다.
  • 셰이더 전반에서 루트 서명 또는 디스크립터 세트 재사용 간의 균형을 찾아보세요.
  • 드로우 간에 변경되지 않는 여러 상수 버퍼의 경우 모든 상수 버퍼 뷰를 하나의 디스크립터 테이블에 패킹하는 것이 좋습니다..
  • 연속된 레지스터 범위에 걸쳐 있지 않고 그리기 사이에 변경되지 않는 여러 개의 정렬되지 않은 액세스 뷰(UAV) 및 셰이더 리소스 뷰(SRV)의 경우 설명자 테이블에 패킹하는 것이 가장 좋습니다.
  • 디스크립터 힙 변경을 최소화합니다. 디스크립터 힙을 변경하면 그래픽 파이프라인이 심각하게 지연됩니다. 모든 리소스는 하나의 디스크립터 힙에서 뷰를 할당하는 것이 이상적입니다.
  • 불필요한 설명자가 정의되고 활용되지 않는 일반적인 루트 서명 정의는 피하세요. 대신 루트 서명 정의를 필요한 최소한의 설명자 테이블 집합으로 최적화하세요.
    • Vulkan: 디스크립터 세트를 생성할 때 BindAfterFlag 비트를 사용하면 Xe-LP가 1M 디스크립터만 지원한다는 점에 유의하세요. 필요한 디스크립터만 생성하십시오(DX12에서 포팅하는 경우, 다음 사항을 기억하십시오.
      D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV maps to 7 Vulkan types [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, *_STORAGE_IMAGE, *_UNIFORM_TEXEL_BUFFER,*_STORAGE_TEXEL_BUFFER, *_UNIFORM_BUFFER, *_STORAGE_BUFFER])
  • 상수로 작업할 때는 루트 디스크립터보다 루트 상수를, 디스크립터 테이블보다 루트 디스크립터를 선호합니다.
    • 루트/푸시 상수를 사용하여 상수 버퍼 데이터에 빠르게 액세스할 수 있습니다(레지스터에 미리 로드되어 있음).
    • 루트/푸시 상수는 자주 변경되는 상수 버퍼 데이터에 사용하기에 좋습니다.
  • 상수가 높은 빈도로 변경되는 경우 루트/푸시 상수를 사용합니다..
    • 특정 루트 서명 슬롯이 덜 자주 사용되는 경우(PSO에서 참조하지 않음), 루트 서명 끝에 배치하여 GRF 사용량을 줄이세요.
  • 다음과 같이 드라이버가 상수 기반 최적화를 수행할 수 있는 힌트를 사용해야 합니다. D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC.
  • 배치된 리소스의 경우 리소스에 렌더링하기 전에 지우기, 복사 또는 버리기로 초기화합니다. 이렇게 하면 배치된 리소스를 유효한 상태로 만들어 적절한 압축이 가능합니다.
  • 리소스 힙을 생성할 때 GPU에서 액세스해야 하는 리소스는 GPU 메모리에 상주하는 것으로 선언된 힙에 배치해야 하며, 가급적 독점적으로 배치해야 합니다. 이는 개별 GPU 성능에 상당한 영향을 미칩니다.
  • 쿼리를 사용하여 GPU 로컬 메모리가 초과 구독되는 시나리오를 식별하고 이를 수용하도록 리소스 위치를 조정합니다.

프레젠테이션
벌칸, DirectX 12, OpenGL의 바인드리스 렌더링 살펴보기 [2021-04-21]
https://www.youtube.com/watch?v=SVm0HanVTRw

D3D12

문서
바인딩 없는 디스크립터 
https://wickedengine.net/2021/04/06/bindless-descriptors/
구속력 없는 바인딩
https://alextardif.com/Bindless.html
디퍼드 렌더링 및 데칼을 위한 바인드리스 텍스처링
https://therealmjp.github.io/posts/bindless-texturing-for-deferred-rendering-and-decals/
https://github.com/TheRealMJP/DeferredTexturing

Vulkan

문서
벌칸에서 바인드리스 디스크립터 관리하기
https://dev.to/gasim/implementing-bindless-design-in-vulkan-34no
New game changing Vulkan extensions for mobile: Descriptor Indexing
벌칸 1: 바인드리스 텍스처
https://jorenjoestar.github.io/post/vulkan_bindless_texture/
바인딩 없는 디스크립터 집합
https://vincent-p.github.io/posts/vulkan_bindless_descriptors/
벌칸의 디스크립터리스 렌더링
https://msiglreith.gitbook.io/blog/descriptorless-rendering-in-vulkan
프레젠테이션
Setting up a bindless rendering pipeline
리소스 및 설명자 | "벌칸 셰이더에서 버퍼 및 이미지 사용"
https://www.youtube.com/watch?v=5VBVWCg7riQ


원문
 

[D3D12]Bindless Resources Notes

keywords: Direct3D 12, D3D12, Vulkan, Bindless, Texture and Buffer, DescriptorSet, Descriptor Set Layout, Descriptor Indexing

dawnarc.com