Общие кучы
Общий доступ полезен для архитектур с несколькими процессами и несколькими адаптерами.
Общие сведения о совместном доступе
Общие кучи позволяют двумя способами: совместное использование данных в куче в одной или нескольких процессах, а также включение недетерминированного выбора неопределенного макета текстуры для ресурсов, размещенных в куче. Совместное использование кучи между адаптерами также устраняет необходимость маршалирования ЦП данных.
Кучи и зафиксированные ресурсы можно совместно использовать. Совместное использование зафиксированного ресурса фактически разделяет неявную кучу вместе с описанием зафиксированного ресурса, чтобы совместимое описание ресурса можно сопоставить с кучей с другого устройства.
Все методы являются свободными потоками и наследуют существующую семантику D3D11 для структуры общего доступа к дескриптору NT.
- ID3D12Device::CreateSharedHandle
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
Общий доступ кучи между процессами
Общие кучи указываются с элементом 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
Дополнительные сведения об использовании нескольких адаптеров см. в разделе "Системы с несколькими адаптерами".