D3D12_FEATURE_DATA_ARCHITECTURE1 结构 (d3d12.h)

提供有关每个适配器的体系结构详细信息,以便应用程序可以更好地针对某些适配器属性进行优化。

注意此结构在 Windows 10 版本 1703 中引入, (创意者的更新) ,取代了D3D12_FEATURE_DATA_ARCHITECTURE结构。 如果应用程序面向Windows 10版本 1703 (创意者的更新) 或更高版本,请使用 D3D12_FEATURE_DATA_ARCHITECTURE1 (和 D3D12_FEATURE_ARCHITECTURE1) 。
 

语法

typedef struct D3D12_FEATURE_DATA_ARCHITECTURE1 {
  UINT NodeIndex;
  BOOL TileBasedRenderer;
  BOOL UMA;
  BOOL CacheCoherentUMA;
  BOOL IsolatedMMU;
} D3D12_FEATURE_DATA_ARCHITECTURE1;

成员

NodeIndex

在多适配器操作中,这指示设备的哪个物理适配器相关。 请参阅 多适配器系统NodeIndex 在调用 CheckFeatureSupport 之前由应用程序填写,因为应用程序可以检索有关每个适配器体系结构的详细信息。

TileBasedRenderer

指定硬件和驱动程序是否支持基于磁贴的呈现器。 如果硬件和驱动程序支持基于磁贴的呈现器,则运行时将此成员设置为 TRUE

UMA

指定硬件和驱动程序是否支持 UMA。 如果硬件和驱动程序支持 UMA,则运行时将此成员设置为 TRUE

CacheCoherentUMA

指定硬件和驱动程序是否支持缓存一致的 UMA。 如果硬件和驱动程序支持缓存一致的 UMA,则运行时将此成员设置为 TRUE

IsolatedMMU

SALOut

指定硬件和驱动程序是否支持独立内存管理单元 (MMU) 。 如果 GPU 遵循 CPU 页表属性(如 MEM_WRITE_WATCH (),则运行时将此成员设置为 TRUE,有关详细信息,请参阅 VirtualAlloc) 和 PAGE_READONLY (,请参阅内存保护常量) 。

如果 为 TRUE,则应用程序必须注意不要将这些页表属性与 GPU 配合使用,因为 GPU 可能会以意外方式触发这些页表属性。 例如,GPU 写入操作可能比应用程序预期的要粗糙,尤其是从着色器内部写入。 某些写入watch页可能脏显示,即使 GPU 写入对它们的影响并不明显。 与上传和读回堆使用方案关联的 GPU 操作适用于写watch页,但有时可能会生成可以安全忽略的误报。

注解

如何使用 UMA 和 CacheCoherentUMA

D3D12 应用应关注于管理内存驻留和提供最佳堆属性。 D3D12 应用只需管理 D3D12_HEAP_TYPE_DEFAULT堆中的资源的驻留,即可在多个 GPU 体系结构中保持简化并合理运行。 这些应用只需调用 IDXGIAdapter3::QueryVideoMemoryInfo 进行DXGI_MEMORY_SEGMENT_GROUP_LOCAL,并且它们必须能够容忍D3D12_HEAP_TYPE_UPLOAD和D3D12_HEAP_TYPE_READBACK来自同一内存段组。

但是,对于超出限制的应用程序,这种简单的设计过于受限。 因此,D3D12_FEATURE_DATA_ARCHITECTURE可帮助应用程序更好地优化基础适配器属性。

某些应用程序可能希望更好地优化离散适配器,并承担管理系统内存和视频内存预算的额外复杂性。 如果上传堆的大小与默认纹理的大小相媲美,内存利用率几乎翻倍。 支持此类优化时,应用程序可以检测两个驻留预算或识别 UMA为 false

某些应用程序可能希望针对集成/UMA 适配器进行更好的优化,尤其是那些有兴趣在移动设备上延长电池使用时间的应用程序。 简单的 D3D12 应用程序被迫在具有不同属性的堆之间复制数据,而 UMA 并非始终需要这些数据。 但是,UMA 属性本身包含 GPU 设计的一个相当模糊的灰色区域。 不要假设 UMA 意味着所有 GPU 可访问的内存都可以自由访问 CPU,因为它不会。 有一个属性更符合这种思维类型: CacheCoherentUMA

CacheCoherentUMAfalse 时,可以使用单个驻留预算,但 UMA 设计通常受益于三个堆属性。 通过明智使用上传和读回资源和堆来删除资源复制的机会确实存在,这些资源提供对内存的 CPU 访问权限。 不过,这种机会并不明确。 因此,应用程序应谨慎;建议跨各种“UMA”系统进行试验,因为可能需要启用或排除某些设备 ID。 建议了解 GPU 内存体系结构以及堆类型如何转换为缓存属性。 成功的可行性可能取决于每个处理器读取或写入数据的频率、数据访问的大小和位置等。对于高级开发人员:当 UMA 为 true 且 CacheCoherentUMAfalse 时,这些适配器的最独特特征是上传堆仍为写入组合。 但是,某些 UMA 适配器受益于默认堆和上传堆的无 CPU 访问属性和写合并属性。 有关更多详细信息 ,请参阅 GetCustomHeapProperties

CacheCoherentUMA 为 true 时,应用程序可以更强烈地接受放弃堆的归属并使用等效于随处上传堆的自定义堆。 更普遍地鼓励使用 WriteToSubresource 提供的零复制 UMA 优化,因为更多的方案将仅受益于共享使用。 内存模型非常有利于更多场景和更广泛的采用。 一些角落案例可能仍然存在,其中的好处不容易获得,但它们应该比其他选项少得多,而且危害较小。 对于高级开发人员: CacheCoherentUMA 意味着内存层次结构中的大量缓存也在 CPU 和 GPU 之间统一或集成。 最独特的可观测特征是上传堆实际上是在 CacheCoherentUMA 上写回的。 对于这些体系结构,在上传堆上使用写合并通常是不利的。

绝大多数单适配器应用程序应忽略低级别详细信息。 与往常一样,单适配器应用程序可以简化环境,并确保 CPU 写入到上传堆时使用易于写入合并的模式。 较低级别的详细信息有助于强化多适配器应用程序的概念。 多适配器应用程序可能需要充分了解适配器体系结构属性,以选择最佳的自定义堆属性,以便有效地在适配器之间移动数据。

要求

要求
Header d3d12.h

另请参阅

核心结构

D3D12_FEATURE