DXIL之版本化
DXIL之版本控制(Versioning)
DXIL着色器中有三种版本控制机制:着色器模型(shader model)、DXIL版本和LLVM位码版本。 在高层次上,着色器模型描述了目标执行模型和环境;DXIL提供了一种表达程序的机制(包括关于数据类型和操作的规则);而LLVM位码提供了一种编码DXIL程序的方式。
着色器模型 (Shader Model)
DXIL中的着色器模型与DXBC的着色器模型类似。着色器模型指定了执行模型,着色器指令可以使用的功能集以及着色器程序必须遵守的约束。着色器模型在DXIL中被指定为一个命名的元数据。
!dx.shaderModel = !{ !0 } !0 = !{ !"<shadelModelName>", i32 <major>, i32 <minor> }
<shadelModelName><major><minor>可以支持以下值:
DXIL验证器确保DXIL符合指定的着色器模型要求。
对于6.0之前的着色器模型,只有适用于DXIL表示的规则是有效的。例如,最大资源数量的限制是被遵守的,但是寄存器数量的限制则不适用,因为DXIL没有对寄存器的表示方式。
DXIL的版本
推进HLSL功能演变的主要机制是通过着色器模型。然而,DXIL版本是为了未来扩展的额外灵活性而保留的。目前定义了两个版本:1.0和1.1。DXIL版本具有主要版本和次要版本,这些版本被指定为命名元数据:
!dx.version = !{ !0 } !0 = !{ i32 <major>, i32 <minor> }
DXIL版本必须在每个LLVM模块(翻译单元)中仅声明一次,并且在整个模块范围内有效。
DXIL将以保持向后兼容性的方式进行演进。
DXIL 1.1 变化
DXIL1.1(Shader Model 6.1)引入的两个主要功能是视图实例化和重心坐标。具体而言,对DXIL表示进行了以下更改。
- 新增的内置(Intrinsics )- AttributeAtVertex ,ViewID
- 新的系统生成值- SV_Barycentrics
- 新增容器部分 - ILDN
DXIL 1.2变化
DXIL的操作:
RawBufferLoad 用于ByteAddressBuffer
RawBufferStore 用于 StructuredBuffer
将 fp32-denorm-mode=<value>
作为float32的函数属性,用于指定denorm模式。
LLVM Bitcode version
DXIL的当前版本基于LLVM Bitcode v3.7。此编码必然受到DXIL模块外部因素的影响。
名称解释
Bitcode是一种中间表示形式,它是由LLVM编译器生成的一种低级别的、平台无关的二进制格式。它可以被进一步转换为不同的目标平台的机器代码,或者在需要时重新优化和重编译。 与传统的目标文件相比,Bitcode包含了高级别的语义信息和编译器优化的结果。它不仅包含了源代码的结构和指令序列,还包含了类型信息、控制流图、符号表等数据,这使得它具有更多的灵活性和可移植性。 Bitcode的一个重要特点是可以进行后期优化。通过将Bitcode保留在编译过程的中间阶段,可以在之后的阶段中进行针对具体平台的优化,包括指令选择、寄存器分配和指令调度等。这使得Bitcode在跨平台编译、代码优化和程序分析等领域具有广泛的应用。Denorm mode(非规格化模式)是计算机中浮点数运算的一种模式。在浮点数表示中,正常的规格化浮点数(normalized numbers)有一个隐含的首位非零位,而非规格化浮点数(denormalized numbers)则没有隐含的首位非零位。
当一个浮点数的指数部分全为0时,会被视为非规格化浮点数。非规格化浮点数可以表示接近零的值,但它们的精度相对较低。Denorm mode允许在浮点数运算中使用非规格化数值,以提供更大范围的表达能力,但会降低精度。
Denorm mode指定了如何处理非规格化浮点数的操作,例如加法、乘法等。它可以在浮点数运算中控制非规格化数值的处理方式,从而影响计算结果的精度和范围。不同的Denorm mode设置可以在性能和精度之间进行权衡。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?