Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Procesory GPU ujednoliconej architektury pamięci (UMA) oferują pewne korzyści w zakresie wydajności w przypadku dyskretnych procesorów GPU, zwłaszcza w przypadku optymalizacji pod kątem urządzeń przenośnych. Udzielanie zasobów dostępu procesora CPU, gdy procesor GPU jest UMA może zmniejszyć ilość kopiowania, która występuje między procesorem CPU i procesorem GPU. Chociaż nie zalecamy, aby aplikacje niewidomie udzielały dostępu procesora CPU do wszystkich zasobów w projektach UMA, istnieją możliwości poprawy wydajności dzięki udzieleniu odpowiedniego dostępu do zasobów procesora CPU. W przeciwieństwie do dyskretnych procesorów GPU procesor CPU może technicznie mieć wskaźnik do wszystkich zasobów, do których procesor GPU może uzyskać dostęp.
- Omówienie tekstur dostępnych dla procesora CPU
- Omówienie standardowej Swizzle
- interfejsy API
- Tematy pokrewne
Omówienie tekstur dostępnych dla procesora CPU
Tekstury dostępne dla procesora CPU w potoku graficznym to funkcja architektury UMA umożliwiająca odczyt i zapis procesorów CPU do tekstur. Na bardziej typowych dyskretnych procesorach GPU procesor nie ma dostępu do tekstur w potoku grafiki.
Ogólna porada dotycząca najlepszych rozwiązań dla tekstur polega na uwzględnienia dyskretnych procesorów GPU, które zwykle obejmują następujące procesy w przekazywanie danych tekstury za pośrednictwem, podsumowane jako:
- Brak dostępu do procesora CPU dla większości tekstur.
- Ustawianie układu tekstury na D3D12_TEXTURE_LAYOUT_UNKNOWN.
- Przekazywanie tekstur do procesora GPU za pomocą CopyTextureRegion.
Jednak w niektórych przypadkach procesor CPU i procesor GPU mogą współdziałać tak często z tymi samymi danymi, że tekstury mapowania stają się przydatne do oszczędzania energii lub przyspieszenia konkretnego projektu na określonych kartach lub architekturach. Aplikacje powinny wykrywać te przypadki i optymalizować niepotrzebne kopie. W takim przypadku w celu uzyskania najlepszej wydajności należy wziąć pod uwagę następujące kwestie:
Zacznij bawić się tylko lepszą wydajnością tekstur mapowania, gdy D3D12_FEATURE_DATA_ARCHITECTURE::UMA ma wartość TRUE. Następnie zwróć uwagę na CacheCoherentUMA, jeśli zdecydujesz, które właściwości pamięci podręcznej procesora CPU wybrać na stercie.
Korzystanie z dostępu do procesora CPU dla tekstur jest bardziej skomplikowane niż w przypadku. Najbardziej wydajne układy tekstur dla procesorów GPU są rzadko row_major. W rzeczywistości niektóre procesory GPU mogą obsługiwać tylko tekstury row_major podczas kopiowania danych tekstur wokół.
Procesory GPU UMA powinny powszechnie korzystać z prostej optymalizacji, aby skrócić czas ładowania na poziomie. Po rozpoznaniu UMA aplikacja może zoptymalizować początkowe CopyTextureRegion, aby wypełnić tekstury, których procesor GPU nie zmodyfikuje. Zamiast tworzyć tekstury w stercie z D3D12_HEAP_TYPE_DEFAULT i przeładowywać dane tekstury, aplikacja może użyć WriteToSubresource, aby uniknąć zrozumienia rzeczywistego układu tekstury.
W D3D12 tekstury utworzone przy użyciu D3D12_TEXTURE_LAYOUT_UNKNOWN i bez dostępu do procesora CPU są najbardziej wydajne w przypadku częstego renderowania i próbkowania procesora GPU. Podczas testowania wydajności te tekstury powinny być porównywane z D3D12_TEXTURE_LAYOUT_UNKNOWN z dostępem do procesora CPU i D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE z dostępem do procesora CPU oraz D3D12_TEXTURE_LAYOUT_ROW_MAJOR na potrzeby obsługi wielu kart.
Użycie D3D12_TEXTURE_LAYOUT_UNKNOWN z dostępem do procesora CPU umożliwia metody WriteToSubresource, ReadFromSubresource, Map (wstępny dostęp aplikacji do wskaźnika) i Unmap; ale może poświęcić wydajność dostępu do procesora GPU.
Użycie D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE z dostępem do procesora CPU umożliwia WriteToSubresource, ReadFromSubresource, Map (która zwraca prawidłowy wskaźnik do aplikacji) i Unmap. Może również poświęcić wydajność dostępu do procesora GPU więcej niż D3D12_TEXTURE_LAYOUT_UNKNOWN z dostępem do procesora CPU.
Omówienie standardowego swizzle
D3D12 (i D3D11.3) wprowadza standardowy wielowymiarowy układ danych. Jest to możliwe, aby umożliwić wielu jednostkom przetwarzania działanie na tych samych danych bez kopiowania danych lubwizzowania danych między wieloma układami. Ustandaryzowany układ umożliwia zwiększenie wydajności dzięki efektom sieciowym i umożliwia algorytmom wykonywanie krótkich cięć przy założeniu określonego wzorca.
Aby uzyskać szczegółowy opis układów tekstury, zobacz D3D12_TEXTURE_LAYOUT.
Należy jednak pamiętać, że ten standardowy swizzle jest funkcją sprzętową i może nie być obsługiwany przez wszystkie procesory GPU.
Aby uzyskać podstawowe informacje na tematwizowania, zapoznaj się z krzywą z kolejnością Z.
Apis
W przeciwieństwie do D3D11.3 D3D12 domyślnie obsługuje mapowanie tekstur, więc nie ma potrzeby wykonywania zapytań D3D12_FEATURE_DATA_D3D12_OPTIONS. Jednak D3D12 nie zawsze obsługuje standardowewizzle — ta funkcja musi być odpytywana za pomocą wywołania CheckFeatureSupport i sprawdzenia StandardSwizzle64KBSupported pola D3D12_FEATURE_DATA_D3D12_OPTIONS.
Następujące interfejsy API odwołują się do mapowania tekstur:
Wyliczenia
- D3D12_TEXTURE_LAYOUT : kontroluje wzorzecwizłu domyślnych tekstur i włącza obsługę map na teksturach dostępnych dla procesora CPU.
Struktur
- D3D12_RESOURCE_DESC : opisuje zasób, taki jak tekstura, jest to szeroko używana struktura.
- D3D12_HEAP_DESC : opisuje stertę.
Metody
- ID3D12Device::CreateCommittedResource : tworzy pojedynczy zasób i stertę zapasową odpowiedniego rozmiaru i wyrównania.
- ID3D12Device::CreateHeap : tworzy stertę dla buforu lub tekstury.
- ID3D12Device::CreatePlacedResource : tworzy zasób umieszczony w określonej stercie, zwykle szybszą metodą tworzenia zasobu niż CreateHeap.
- ID3D12Device::CreateReservedResource : tworzy zasób zarezerwowany, ale nie został jeszcze zatwierdzony lub umieszczony w stercie.
- ID3D12CommandQueue::UpdateTileMappings: aktualizuje mapowania lokalizacji kafelków w zasobach kafelków do lokalizacji pamięci w stercie zasobów.
- ID3D12Resource::Map : pobiera wskaźnik do określonych danych w zasobie i odmawia dostępu procesora GPU do podźródła.
- ID3D12Resource::GetDesc : pobiera właściwości zasobu.
- ID3D12Heap::GetDesc pobiera właściwości sterta.
- ReadFromSubresource : kopiuje dane z tekstury mapowanej przy użyciu Map.
- WriteToSubresource : kopiuje dane do tekstury mapowanej przy użyciu Map.
Zasoby i stosy nadrzędne mają wymagania dotyczące wyrównania:
- D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4MB) dla tekstur z wieloma próbkami.
- D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 KB) dla pojedynczych tekstur i próbki.
- Kopiowanie podźródła liniowego musi być wyrównane do D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 bajtów), a skok wiersza jest wyrównany do D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bajtów).
- Widoki buforu stałego muszą być wyrównane do D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 bajtów).
Tekstury mniejsze niż 64 KB powinny być przetwarzane za pośrednictwem CreateCommittedResource.
Dzięki dynamicznym teksturom (teksturom, które zmieniają każdą ramkę) procesor CPU będzie zapisywać liniowo na stercie przekazywania, a następnie operację kopiowania procesora GPU.
Zazwyczaj tworzenie zasobów dynamicznych tworzy duży bufor w stercie przekazywania (zobacz Suballocation Within Buffers). Aby utworzyć zasoby przejściowe, utwórz duży bufor w stercie odczytu zwrotnego. Aby utworzyć domyślne zasoby statyczne, utwórz sąsiadujące zasoby w domyślnym stercie. Aby utworzyć domyślne zasoby z aliasami, utwórz nakładające się zasoby w domyślnym stercie.
writeToSubresource i ReadFromSubresource zmienia rozmieszczenie danych tekstur między układem głównym wiersza a niezdefiniowanym układem zasobów. Operacja jest synchroniczna, więc aplikacja powinna mieć na uwadze planowanie procesora CPU. Aplikacja zawsze może podzielić kopiowanie na mniejsze regiony lub zaplanować tę operację w innym zadaniu. Zasoby MSAA i zasoby wzornikowe ze szczegółowymi układami zasobów nie są obsługiwane przez te operacje kopiowania procesora CPU i spowodują awarię. Formaty, które nie mają rozmiaru elementu power-of-two, również nie są obsługiwane, a także spowodują awarię. Kody powrotne braku pamięci mogą wystąpić.
Tematy pokrewne