Udostępnij za pośrednictwem


Współużytkowany szpad

Udostępnianie jest przydatne w przypadku architektur wieloprocesowych i wielo adapterów.

Omówienie udostępniania

Udostępnione sterty umożliwiają dwie rzeczy: udostępnianie danych w stercie między co najmniej jednym procesem i wykluczanie niedeterministycznego układu niezdefiniowanej tekstury dla zasobów umieszczonych w stercie. Udostępnianie stertów między adapterami eliminuje również potrzebę marshalingu procesora CPU danych.

Można udostępniać zasoby zarówno stertowe, jak i zatwierdzone. Udostępnianie zatwierdzonego zasobu faktycznie współużytkuje niejawną stertę wraz z zatwierdzonym opisem zasobu, tak aby można było zamapować zgodny opis zasobu na stertę z innego urządzenia.

Wszystkie metody są bezwątkowy i dziedziczą istniejącą semantyka D3D11 projektu obsługi udostępniania NT.

Udostępnianie stert między procesami

Współużytkowane stery są określane z elementem członkowskim D3D12_HEAP_FLAG_SHARED wyliczenia D3D12_HEAP_FLAGS.

Współużytkowane stery nie są obsługiwane na szpadach dostępnych dla procesora CPU: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK i D3D12_HEAP_TYPE_CUSTOM bez D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

Precluding a non-deterministic wybór niezdefiniowanego układu tekstury może znacznie osłabić odroczone scenariusze renderowania na niektórych procesorach GPU, więc nie jest to domyślne zachowanie dla umieszczonych i zatwierdzonych zasobów. Renderowanie odroczone jest osłabione w niektórych architekturach procesora GPU, ponieważ układy tekstur deterministycznych zmniejszają efektywną przepustowość pamięci osiąganą podczas renderowania jednocześnie do wielu tekstur docelowych w tym samym formacie i rozmiarze. Architektury procesorów GPU ewoluują od korzystania z niedeterministycznych układów tekstur w celu zapewnienia obsługi standardowych wzorcówwizdów i standardowych układów w celu wydajnego renderowania odroczonego.

Współdzielone sterty są również związane z innymi niewielkimi kosztami:

  • Udostępnione dane sterty nie mogą być odzyskiwane tak elastycznie, jak sterty procesowe ze względu na obawy dotyczące ujawniania informacji, więc pamięć fizyczna jest zerowa częściej.
  • Istnieje niewielkie dodatkowe obciążenie procesora CPU i zwiększone użycie pamięci systemowej podczas tworzenia i niszczenia współużytkowanych stert.

Udostępnianie stertów między adapterami

Współużytkowany stert między kartami jest określony element członkowski D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER wyliczenia D3D12_HEAP_FLAGS.

Stertowanie współużytkujące karty krzyżowe umożliwia wielu kartom udostępnianie danych bez marshalingu danych między nimi przez procesor. Podczas gdy różne możliwości adapterów określają, jak wydajne karty mogą przekazywać dane między nimi, tylko włączenie kopii procesora GPU zwiększa efektywną przepustowość osiąganą. Niektóre układy tekstur są dozwolone na stercie adaptera krzyżowego w celu obsługi wymiany danych tekstury, nawet jeśli takie układy tekstury nie są obsługiwane w inny sposób. Niektóre ograniczenia mogą dotyczyć takich tekstur, takich jak tylko obsługa kopiowania.

Współużytkowanie między kartami współdziała z stertami utworzonymi przez wywołanie ID3D12Device::CreateHeap. Następnie aplikacja może tworzyć zasoby za pomocą CreatePlacedResource. Jest ona również dozwolona przez zasoby/stosy utworzone przez CreateCommittedResource ale tylko w przypadku zasobów D3D12_RESOURCE_DIMENSION_TEXTURE2D głównych wierszy (zobacz D3D12_RESOURCE_DIMENSION). Współużytkowanie między kartami nie działa z CreateReservedResource.

W przypadku współużytkowania między kartami wszystkie typowe reguły współużytkowania zasobów między kolejkami nadal mają zastosowanie. Aplikacja musi wydać odpowiednie bariery, aby zapewnić właściwą synchronizację i spójność między dwiema kartami. Aplikacja powinna używać ogrodzeń krzyżowych do koordynowania planowania list poleceń przesłanych do wielu kart. Nie ma mechanizmu udostępniania zasobów między adapterami w wersjach interfejsu API D3D. Współużytkowane zasoby między kartami są obsługiwane tylko w pamięci systemowej. Współużytkowane stery/zasoby między kartami są obsługiwane w D3D12_HEAP_TYPE_DEFAULT stercie i D3D12_HEAP_TYPE_CUSTOM stercie (z pulą pamięci L0 i właściwościami strony procesora CPU łączenia zapisu). Sterowniki muszą mieć pewność, że operacje odczytu/zapisu procesora GPU do współużytkowanych stert między kartami są spójne z innymi procesorami GPU w systemie. Na przykład sterownik może wymagać wykluczenia danych stertowania znajdujących się w pamięciach podręcznych procesora GPU, które zwykle nie muszą być opróżniane, gdy procesor CPU nie może bezpośrednio uzyskać dostępu do danych stert.

Aplikacja powinna ograniczać użycie stertów krzyżowych tylko do tych scenariuszy, które wymagają zapewnianych przez nich funkcji. Sterta między adapterami znajdują się w D3D12_MEMORY_POOL_L0, co nie zawsze jest GetCustomHeapProperties sugeruje. Ta pula pamięci nie jest wydajna w przypadku architektur kart dyskretnych/NUMA. Najbardziej wydajne układy tekstur nie zawsze są dostępne.

Obowiązują również następujące ograniczenia:

  • Flagi sterta związane z warstwami stert muszą być D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
  • D3D12_HEAP_FLAG_SHARED należy również ustawić.
  • Należy ustawić D3D12_HEAP_TYPE_DEFAULT lub D3D12_HEAP_TYPE_CUSTOM z D3D12_MEMORY_POOL_L0 i D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.
  • Na stercie między adapterami można umieścić tylko zasoby z D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER.
  • Nie można przekazać chronionej sesji do utworzenia sterta po określeniu D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER

Aby uzyskać więcej informacji na temat korzystania z wielu kart, zapoznaj się z sekcją Multi-adapter systems (Systemy wielo adapterów).