Поделиться через


Оптимизация UMA: доступные ЦП текстуры и стандартное преобразование ссылок при перемещении данных с внешнего устройства

GPU универсальной архитектуры памяти (UMA) обеспечивают некоторые преимущества эффективности по сравнению с дискретными GPU, особенно при оптимизации для мобильных устройств. Предоставление ресурсам доступа к ЦП, когда GPU имеет значение UMA, может сократить объем копирования между ЦП и GPU. Хотя мы не рекомендуем приложениям слепо предоставлять доступ к ЦП ко всем ресурсам в проектах UMA, существуют возможности для повышения эффективности, предоставляя правильный доступ к ЦП. В отличие от дискретных GPU, ЦП технически может иметь указатель на все ресурсы, к которым может получить доступ GPU.

Обзор текстур, доступных для ЦП

Текстуры, доступные ЦП, в графическом конвейере являются функцией архитектуры UMA, которая позволяет ЦП читать и записывать текстуры. На более распространенных дискретных GPU ЦП не имеет доступа к текстурам в графическом конвейере.

Общие рекомендации по текстурам — размещение дискретных GPU, которые обычно включают в себя процессы, описанные в разделе Отправка данных текстуры через буферы:

  • Отсутствие доступа к ЦП для большинства текстур.
  • Установка макета текстуры в D3D12_TEXTURE_LAYOUT_UNKNOWN.
  • Отправка текстур в GPU с помощью CopyTextureRegion.

Однако в некоторых случаях ЦП и GPU могут так часто взаимодействовать с одними и теми же данными, что текстуры сопоставления становятся полезными для экономии энергии или ускорения разработки определенных адаптеров или архитектур. Приложения должны обнаруживать эти случаи и оптимизировать ненужные копии. В этом случае для оптимальной производительности следует учитывать следующее:

  • Начните с лучшей производительности текстур сопоставления, только если D3D12_FEATURE_DATA_ARCHITECTURE::UMA имеет значение TRUE. Затем обратите внимание на CacheCoherentUMA , если вы решите, какие свойства кэша ЦП выбрать в куче.

  • Использование доступа к ЦП для текстур сложнее, чем для буферов. Наиболее эффективные макеты текстур для GPU редко row_major. На самом деле некоторые gpu могут поддерживать только row_major текстуры при копировании данных текстуры.

  • Графические процессоры UMA должны пользоваться преимуществами простой оптимизации, чтобы сократить время загрузки уровня. После распознавания UMA приложение может оптимизировать начальную копию CopyTextureRegion , чтобы заполнить текстуры, которые GPU не будет изменять. Вместо создания текстуры в куче с D3D12_HEAP_TYPE_DEFAULT и маршалинга данных текстуры приложение может использовать WriteToSubresource , чтобы избежать понимания фактического макета текстуры.

  • В D3D12 текстуры, созданные с помощью D3D12_TEXTURE_LAYOUT_UNKNOWN без доступа к ЦП, являются наиболее эффективными для частой отрисовки и выборки GPU. При тестировании производительности эти текстуры следует сравнивать с D3D12_TEXTURE_LAYOUT_UNKNOWN с доступом к ЦП, D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE с доступом к ЦП и D3D12_TEXTURE_LAYOUT_ROW_MAJOR для поддержки нескольких адаптеров.

  • Использование D3D12_TEXTURE_LAYOUT_UNKNOWN с доступом к ЦП позволяет использовать методы WriteToSubresource, ReadFromSubresource, Map (исключая доступ приложений к указателю) и Unmap; но может пожертвовать эффективностью доступа к GPU.

  • Использование D3D12_TEXTURE_LAYOUT_STANDARD_SWIZZLE с доступом к ЦП включает writeToSubresource, ReadFromSubresource, Map (который возвращает допустимый указатель на приложение) и Unmap. Он также может пожертвовать эффективностью доступа к GPU более чем D3D12_TEXTURE_LAYOUT_UNKNOWN с доступом к ЦП.

Обзор стандартного Swizzle

D3D12 (и D3D11.3) представляют стандартный многомерный макет данных. Это делается для того, чтобы несколько единиц обработки могли работать с одинаковыми данными без копирования данных или переключения данных между несколькими макетами. Стандартизированный макет позволяет повысить эффективность за счет сетевых эффектов и позволяет алгоритмам делать короткие сокращения, предполагая определенный шаблон.

Подробное описание макетов текстур см. в разделе D3D12_TEXTURE_LAYOUT.

Обратите внимание, что этот стандартный swizzle является аппаратной функцией и может поддерживаться не всеми GPU.

Дополнительные сведения о свертываниях см. в разделе Кривая Z-порядка.

Программные интерфейсы

В отличие от D3D11.3, D3D12 по умолчанию поддерживает сопоставление текстур, поэтому нет необходимости запрашивать D3D12_FEATURE_DATA_D3D12_OPTIONS. Однако D3D12 не всегда поддерживает стандартный swizzle — эту функцию необходимо запросить с вызовом CheckFeatureSupport и проверкой поля StandardSwizzle64KBSupportedD3D12_FEATURE_DATA_D3D12_OPTIONS.

Следующие API ссылались на сопоставление текстур:

Перечисления

  • D3D12_TEXTURE_LAYOUT : управляет шаблоном поворота текстур по умолчанию и включает поддержку карт в текстурах, доступных для ЦП.

Структуры

  • D3D12_RESOURCE_DESC : описывает ресурс, например текстуру. Это широко используемая структура.
  • D3D12_HEAP_DESC : описывает кучу.

Методы

  • ID3D12Device::CreateCommittedResource : создает один ресурс и резервную кучу правильного размера и выравнивания.
  • ID3D12Device::CreateHeap : создает кучу для буфера или текстуры.
  • ID3D12Device::CreatePlacedResource : создает ресурс, который помещается в определенную кучу. Обычно это более быстрый метод создания ресурса, чем CreateHeap.
  • ID3D12Device::CreateReservedResource : создает ресурс, который зарезервирован, но еще не зафиксирован или помещен в кучу.
  • ID3D12CommandQueue::UpdateTileMappings : обновляет сопоставления расположений плиток в мозаичного ресурсах с расположениями памяти в куче ресурсов.
  • ID3D12Resource::Map : получает указатель на указанные данные в ресурсе и запрещает GPU доступ к подресурсы.
  • ID3D12Resource::GetDesc : получает свойства ресурса.
  • ID3D12Heap::GetDesc получает свойства кучи.
  • ReadFromSubresource : копирует данные из текстуры, сопоставленной с помощью map.
  • WriteToSubresource : копирует данные в текстуру, сопоставленную с помощью карты.

Ресурсы и родительские кучи имеют требования к выравниванию:

  • D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT (4 МБ) для текстур с несколькими образцами.
  • D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT (64 КБ) для отдельных текстур и буферов.
  • Линейное копирование подресурсов должно быть выровнено по D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT (512 байт), а шаг строки должен выравнивать по D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 байт).
  • Представления буфера констант должны быть выровнены по D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT (256 байт).

Текстуры размером менее 64 КБ должны обрабатываться с помощью CreateCommittedResource.

С динамическими текстурами (текстурами, которые изменяют каждый кадр) ЦП будет линейно записывать данные в кучу отправки, а затем операцию копирования GPU.

Как правило, для создания динамических ресурсов создается большой буфер в куче отправки (см. раздел Suballocation Within Buffers). Чтобы создать промежуточные ресурсы, создайте большой буфер в куче обратного чтения. Чтобы создать статические ресурсы по умолчанию, создайте смежные ресурсы в куче по умолчанию. Чтобы создать ресурсы с псевдонимами по умолчанию, создайте перекрывающиеся ресурсы в куче по умолчанию.

WriteToSubresource и ReadFromSubresource переупорядочение данных текстуры между основным макетом строки и неопределенным макетом ресурсов. Операция является синхронной, поэтому приложение должно помнить о планировании ЦП. Приложение всегда может разбить копирование на небольшие регионы или запланировать эту операцию в другой задаче. Ресурсы MSAA и трафареты глубины с непрозрачными макетами ресурсов не поддерживаются этими операциями копирования ЦП и приводят к сбою. Форматы, которые не имеют размера двух элементов, также не поддерживаются, что также приведет к сбою. Могут возникать коды возврата за пределы памяти.

Основные константы

ID3D12Heap

Привязка ресурсов