Общие кучы

Общий доступ полезен для архитектур с несколькими процессами и несколькими адаптерами.

Общие сведения о совместном доступе

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

Кучи и зафиксированные ресурсы можно совместно использовать. Совместное использование зафиксированного ресурса фактически разделяет неявную кучу вместе с описанием зафиксированного ресурса, чтобы совместимое описание ресурса можно сопоставить с кучей с другого устройства.

Все методы являются свободными потоками и наследуют существующую семантику D3D11 для структуры общего доступа к дескриптору NT.

Общий доступ кучи между процессами

Общие кучи указываются с элементом D3D12_HEAP_FLAG_SHARED перечисления D3D12_HEAP_FLAGS.

Общие кучи не поддерживаются в кучах, доступных для ЦП: D3D12_HEAP_TYPE_UPLOAD, D3D12_HEAP_TYPE_READBACK и D3D12_HEAP_TYPE_CUSTOM без D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.

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

Общие кучи также приходят с другими незначительными затратами:

  • Общие данные кучи не могут быть перезапущены так же гибко, как и в кучах в процессе из-за проблем раскрытия информации, поэтому физическая память больше не используется.
  • Во время создания и уничтожения общих кучи дополнительных ресурсов ЦП и увеличения использования памяти системы.

Общий доступ кучи между адаптерами

Общие кучи между адаптерами указываются с элементом D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER перечисления D3D12_HEAP_FLAGS .

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

Совместное использование кроссадаптера работает с кучами, созданными путем вызова ID3D12Device::CreateHeap. Затем приложение может создавать ресурсы с помощью CreatePlacedResource. Это также разрешено ресурсами и кучами, созданными CreateCommittedResource, но только для ресурсов с основными строками D3D12_RESOURCE_DIMENSION_TEXTURE2D (см. D3D12_RESOURCE_DIMENSION). Общий доступ между адаптерами не работает с CreateReservedResource.

Для общего доступа между адаптерами все обычные правила общего доступа к ресурсам между очередей по-прежнему применяются. Приложение должно выдавать соответствующие барьеры, чтобы обеспечить правильную синхронизацию и согласованность между двумя адаптерами. Приложение должно использовать межадаптерные ограждения для координации планирования списков команд, отправленных нескольким адаптерам. Нет механизма совместного использования ресурсов между адаптерами в версиях API D3D. Общие ресурсы между адаптерами поддерживаются только в системной памяти. Межадаптерные общие кучи и ресурсы поддерживаются в D3D12_HEAP_TYPE_DEFAULT кучах и D3D12_HEAP_TYPE_CUSTOM кучах (с пулом памяти L0 и свойствами страницы ЦП с объединением операций записи). Драйверы должны быть уверены, что операции чтения и записи GPU для межадаптерных общих кучи согласованы с другими графическими процессорами в системе. Например, драйверу может потребоваться исключить данные кучи из кэша GPU, которые обычно не нужно сбрасывать, когда ЦП не может напрямую получить доступ к данным кучи.

Приложение должно ограничить использование кучи кроссплатформенных адаптеров только тем сценариям, которые требуют функциональных возможностей, которые они предоставляют. Кроссплатформенный кучи находятся в D3D12_MEMORY_POOL_L0, что не всегда означает GetCustomHeapProperties. Этот пул памяти не эффективен для дискретных архитектур адаптеров NUMA. И наиболее эффективные макеты текстур не всегда доступны.

Также действуют следующие ограничения.

  • Флаги кучи, связанные с уровнями кучи, должны быть D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES.
  • D3D12_HEAP_FLAG_SHARED также необходимо задать.
  • Необходимо задать либо D3D12_HEAP_TYPE_DEFAULT, либо D3D12_HEAP_TYPE_CUSTOM с D3D12_MEMORY_POOL_L0 и D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE.
  • Только ресурсы с D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER могут размещаться в кучах между адаптерами.
  • Защищенный сеанс нельзя передать в создание кучи при указании D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER

Дополнительные сведения об использовании нескольких адаптеров см. в разделе "Системы с несколькими адаптерами".