Share via


공유 힙

공유는 다중 프로세스 및 다중 어댑터 아키텍처에 유용합니다.

공유 개요

공유 힙은 두 가지 작업을 가능하게 합니다. 즉, 하나 이상의 프로세스에서 힙의 데이터를 공유하고, 힙 내에 배치된 리소스에 대해 정의되지 않은 텍스처 레이아웃의 비결정적 선택 사항을 제외할 수 있습니다. 또한 어댑터에서 힙을 공유하면 데이터의 CPU를 마샬링할 필요도 없어집니다.

두 힙 및 커밋된 리소스를 공유할 수 있습니다. 커밋한 리소스를 공유하면 커밋한 리소스 설명과 함께 암시적 힙이 실제로 공유되므로 호환 가능한 리소스 설명을 다른 디바이스에서 힙에 매핑할 수 있습니다.

모든 메서드는 자유 스레드되며, NT 핸들 공유 디자인의 기존 D3D11 의미 체계를 상속합니다.

프로세스에서 힙 공유

공유 힙은 D3D12_HEAP_FLAGS 열거형의 D3D12_HEAP_FLAG_SHARED 멤버로 지정됩니다.

공유 힙은 CPU 액세스 가능 힙(D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK 및 D3D12_HEAP_TYPE_CUSTOM(D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE 없음)에서는 지원되지 않습니다.

정의되지 않은 텍스처 레이아웃의 비결정적인 선택 항목을 제외하면 일부 GPU의 지연 렌더링 시나리오에 심각한 영향을 줄 수 있으므로 배치 및 커밋된 리소스의 경우에는 기본 동작이 아닙니다. 지연 렌더링은 형식과 크기가 같은 여러 렌더 대상 텍스처를 동시에 렌더링할 경우 결정적 텍스처 레이아웃은 효과적인 메모리 대역폭을 줄이기 때문에 일부 GPU 아키텍처에 손상을 줍니다. GPU 아키텍처는 지연 렌더링에 대해 표준화된 다시 구성 패턴 및 표준화된 레이아웃을 효율적으로 지원하기 위해 비결정적 텍스처 레이아웃을 활용하면서 진화하고 있습니다.

공유 힙에는 다음과 같은 기타 부차적인 비용도 발생합니다.

  • 공유 힙 데이터는 정보 공개 문제로 인해 프로세스 내 힙만큼 유연하게 재활용할 수 없으므로 실제 메모리는 더 자주 0이 됩니다.
  • 공유 힙의 생성 및 소멸 동안 약간의 추가적인 CPU 오버헤드가 발생하고 시스템 메모리 사용량이 증가합니다.

어댑터에서 힙 공유

어댑터 간 공유 힙은 D3D12_HEAP_FLAGS 열거형의 D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER 멤버로 지정됩니다.

어댑터 간 공유 힙은 어댑터 간에 데이터의 CPU 마샬링 없이 여러 어댑터에서 데이터를 공유할 수 있도록 합니다. 다양한 어댑터 기능에 따라 어댑터가 데이터를 전달하는 효율성이 결정되지만, GPU 복사만 사용하도록 설정해도 달성되는 대역폭 효과가 높아집니다. 일부 텍스처 레이아웃은 지원되지 않더라도, 텍스처 데이터의 교환을 지원하기 위해 어댑터 간 힙에서 허용됩니다. 이러한 텍스처에는 특정 제한(예: 복사만 지원)이 적용될 수 있습니다.

어댑터 간 공유는 ID3D12Device::CreateHeap을 호출하여 만든 힙에 작동합니다. 그러면 애플리케이션에서 CreatePlacedResource를 통해 리소스를 만들 수 있습니다. 또한 CreateCommittedResource에서 만든 리소스/힙에서 허용되지만 행 주 D3D12_RESOURCE_DIMENSION_TEXTURE2D 리소스에만 허용됩니다(D3D12_RESOURCE_DIMENSION 참조). 어댑터 간 공유는 CreateReservedResource에서 작동하지 않습니다.

어댑터 간 공유에도 모든 일반적인 큐 간 리소스 공유 규칙이 계속 적용됩니다. 애플리케이션은 두 어댑터 간의 적절한 동기화 및 일관성을 보장하기 위해 적절한 장벽을 실행해야 합니다. 애플리케이션은 어댑터 간 펜스를 사용하여 여러 어댑터에 제출된 명령 목록의 일정을 조정해야 합니다. 여러 D3D API 버전에서 어댑터 간 리소스를 공유할 수 있는 메커니즘은 없습니다. 어댑터 간 공유 리소스는 시스템 메모리에서만 지원됩니다. 어댑터 간 공유 힙/리소스는 D3D12_HEAP_TYPE_DEFAULT 힙 및 D3D12_HEAP_TYPE_CUSTOM 힙(L0 메모리 풀 및 쓰기 결합 CPU 페이지 속성 포함)에서 지원됩니다. 드라이버는 어댑터 간 공유 힙에 대한 GPU 읽기/쓰기 작업이 시스템의 다른 GPU와 일관되는지 확인해야 합니다. 예를 들어 드라이버는 CPU가 힙 데이터에 직접 액세스할 수 없는 경우 일반적으로 플러시할 필요가 없는 GPU 캐시에 있는 힙 데이터를 제외해야 할 수 있습니다.

애플리케이션은 크로스 어댑터 힙의 사용을 제공하는 기능이 필요한 시나리오로만 제한해야 합니다. 어댑터 간 힙은 항상 GetCustomHeapProperties에서 제안하는 것은 아닌 D3D12_MEMORY_POOL_L0 있습니다. 메모리 풀은 불연속/NUMA 어댑터 아키텍처에서 비효율적입니다. 또한 가장 효율적인 텍스처 레이아웃을 항상 사용할 수 있는 것은 아닙니다.

또한 다음과 같은 제한 사항이 적용됩니다.

  • 힙 계층과 관련된 힙 플래그는 D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES 합니다.
  • D3D12_HEAP_FLAG_SHARED 설정해야 합니다.
  • D3D12_MEMORY_POOL_L0 D3D12_HEAP_TYPE_DEFAULT 설정하거나 D3D12_HEAP_TYPE_CUSTOM D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE 설정해야 합니다.
  • D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER 있는 리소스만 어댑터 간 힙에 배치할 수 있습니다.
  • D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER 지정된 경우 보호된 세션을 힙 만들기에 전달할 수 없습니다.

여러 어댑터 사용에 대한 자세한 내용은 다중 어댑터 시스템 섹션을 참조하세요.