D3D12_FEATURE_DATA_ARCHITECTURE1结构 (d3d12.h)

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

注释 Windows 10 版本 1703(创意者更新)中引入的此结构取代了 D3D12_FEATURE_DATA_ARCHITECTURE 结构。 如果应用程序面向 Windows 10 版本 1703(创意者更新)或更高版本,请使用 D3D12_FEATURE_DATA_ARCHITECTURE1D3D12_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 页表属性(有关详细信息,请参阅 virtualAlloc)和 PAGE_READONLY(有关详细信息,请参阅 内存保护常量),运行时会将此成员设置为 MEM_WRITE_WATCH TRUE

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

言论

如何使用 UMA 和 CacheCoherentUMA

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

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

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

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

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

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

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

要求

要求 价值
标头 d3d12.h

另请参阅

核心结构

D3D12_FEATURE