共享堆
共享对于多进程和多适配器体系结构非常有用。
共享概述
共享堆支持以下两项:在一个或多个进程之间共享堆中的数据,以及排除放置在堆中的资源的未定义纹理布局的非确定性选择。 在适配器之间共享堆也无需对数据进行 CPU 封送。
可以共享堆和提交的资源。 共享提交的资源实际上是共享隐式堆以及提交的资源说明,以便可以将兼容的资源说明从其他设备映射到堆。
所有方法都是自由线程,并继承 NT 句柄共享设计的现有 D3D11 语义。
- ID3D12Device::CreateSharedHandle
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
在进程之间共享堆
共享堆通过 D3D12_HEAP_FLAGS 枚举中的 D3D12_HEAP_FLAG_SHARED 成员指定。
在 CPU 可访问的堆上不支持共享堆:不包含 D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE 的 D3D12_HEAP_TYPE_UPLOAD、D3D12_HEAP_TYPE_READBACK 和 D3D12_HEAP_TYPE_CUSTOM。
排除未定义纹理布局的非确定性选择可能会显著损害某些 GPU 上的延迟呈现情况,因此这不是放置和提交的资源的默认行为。 延迟呈现在某些 GPU 体系结构上受损,因为确定性纹理布局减少在同时呈现到格式和大小相同的多个呈现器目标纹理时获得的有效内存带宽。 GPU 体系结构正在演变为不使用非确定性纹理布局,以便有效地支持延迟呈现的标准化重排模式和标准化布局。
共享堆也附带其他少量成本:
- 由于担心信息泄露,共享堆数据不能像进程内堆那样灵活回收,因此物理内存归零的频率更高。
- 在创建和销毁共享堆期间,附加了少量 CPU 开销并增加了系统内存使用量。
在适配器之间共享堆
使用 D3D12_HEAP_FLAGS 枚举中的 D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER 成员指定跨适配器共享堆。
通过跨适配器的共享堆,多个适配器可以在不对其中的数据进行 CPU 封送的情况下共享数据。 虽然不同的适配器功能可以确定适配器传递其中的数据的效率,但仅启用 GPU 副本即可增加获得的有效带宽。 跨适配器堆上允许某些纹理布局,以支持纹理数据交换,即使不支持此类纹理布局也是如此。 某些限制可能适用于此类纹理,例如仅支持复制。
跨适配器共享适用于通过调用 ID3D12Device::CreateHeap 而创建的堆。 然后,应用程序就可以通过 CreatePlacedResource 创建资源。 通过 CreateCommittedResource 创建的资源/堆也允许使用该功能,但仅适用于行主 D3D12_RESOURCE_DIMENSION_TEXTURE2D 资源(请参阅 D3D12_RESOURCE_DIMENSION)。 跨适配器共享并不适用于 CreateReservedResource。
对于跨适配器共享,所有常用跨队列资源共享规则仍适用。 应用程序必须发出适当的障碍,以确保两个适配器之间的适当同步和一致性。 应用程序应使用跨适配器围栏来协调提交给多个适配器的命令列表的调度。 没有用于在 D3D API 版本之间共享跨适配器资源的机制。 系统内存中仅支持跨适配器共享资源。 D3D12_HEAP_TYPE_DEFAULT 堆和 D3D12_HEAP_TYPE_CUSTOM 堆中支持跨适配器共享堆/资源(具有 L0 内存池,和写入合并 CPU 页属性)。 驱动程序必须确保对跨适配器共享堆执行的 GPU 读/写操作与系统上的其他 GPU 一致。 例如,当 CPU 无法直接访问堆数据时,驱动程序可能需要将堆数据排除在通常无需刷新的 GPU 缓存之外。
应用程序应将跨适配器堆的使用限制在需要其提供的功能的情况下。 跨适配器堆位于 D3D12_MEMORY_POOL_L0 中,GetCustomHeapProperties 并不总是建议如此。 该内存池不适用于离散/NUMA 适配器体系结构。 最高效的纹理布局并不总是可用。
还存在下列限制:
- 与堆层相关的堆标志必须为 D3D12_HEAP_FLAG_ALLOW_ALL_BUFFERS_AND_TEXTURES。
- 还必须设置 D3D12_HEAP_FLAG_SHARED。
- 必须设置 D3D12_HEAP_TYPE_DEFAULT 或必须设置带有 D3D12_MEMORY_POOL_L0 和 D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE 的 D3D12_HEAP_TYPE_CUSTOM。
- 只有带有 D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER 的资源才有可能放置在跨适配器堆上。
- 当指定 D3D12_HEAP_FLAG_SHARED_CROSS_ADAPTER 时,受保护会话无法传递到堆的创建中
有关使用多个适配器的详细信息,请参阅多适配器系统部分。