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


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

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

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

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

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

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

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

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

  • Использование доступа К ЦП для текстур сложнее, чем для буферов. Наиболее эффективные макеты текстур для gpu редко row_major. На самом деле некоторые графические процессоры могут поддерживать только текстуры 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 является аппаратным компонентом и не поддерживается всеми графическими процессорами.

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

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

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

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

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

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

Структуры

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

Методы

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

  • 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.

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

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

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

ID3D12Heap

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