● 认识GPU浮点计算精度
DirectX 9.0时代提出的Shader Model 2.0最重要的一点改进是增加对浮点数据的处理功能,以前GPU只能对整数进行处理,改进后提高渲染精度,使最终处理的色彩格式达到电影级别。Shader Model 2.0时代突破了以前限制PC图形图象质量在数学上的精度障碍,它的每条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更漂亮的效果,让程序员编程更容易。而从通用性方面理解,支持浮点运算让GPU已经具备了通用计算的基础,这一点是至关重要的。
如果说DirectX 8中的Shader单元还是个简单尝试的话,DirectX 9中的Shader则成为了标准配置。除了版本升级到2.0外,DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消,在较低DirectX版本游戏运行时会使用VS单元模拟执行硬件T&L单元的功能。
浮点处理器能够统一执行多种任务
后来统一渲染架构提出进一步提高了着色器的运算效率,Pixel Shader(像素着色器)、Vertex Shader(顶点着色器)和Geometry Shader(几何着色器),三种具体的硬件逻辑被整合为一个全功能的着色器Shader。程序员不必为了两种结构不同的着色器分别编写程序,GPU内部的可编程单元被抽象为浮点处理器(Floating Point Processor)。
一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。关于浮点数表示法,我们可以通过看下面的表达式来理解:
Sign×1.matissa×2(exponent-bias)
我们可以将其套用在数143.5的表示上,这对应科学计数法的1.435×102。科学计数法的二进制表示是1.00011111×2111。因此底数被设为00011111(前导的1被省略),将指数偏移127来存储(由特定的浮点格式标准设置),也就是10000110。
不同的浮点格式用不同的位数来表示底数和指数,例如IEEE754标准中,一个32位单精度浮点数有一个符号位、一个8位的指数和一个23位的底数。底数和指数占有的位数决定了我们可以多精确的表示一个数字。对于143.5用IEEE754可以精确表示,但是如果浮点位数过多如143.98375329,就只能被取到143.98375,因为底数只占23位。
今天的GPU已经能够表示IEEE754标准提出的单精度32位和双精度64位浮点数。IEEE单精度格式具有24位有效数字,并总共占用32位。IEEE双精度格式具有53位有效数字精度,并总共占用64位。在这里基本浮点格式是固定格式,相对应的十进制有效数字分别为7位和17位。基本浮点格式对应的C/C++类型为float和double。
但是在以前,确切说是DirectX 9.0时代伊始,GPU还是要通过一代一代的改进才能表示更精确的浮点数。在R420和NV40竞争的时代,在速度和画质选择上,ATI选择了延续FP24+SM2.0的DirectX解决方案,而NVIDIA选择了经历过NV30尝试后成熟的FP32+SM3.0的解决方案。所以我们可以通过当时的GPU硬件浮点精度来看他们表示数字的实际效果,在这里我们还是表达143.98375329:
浮点格式 |
结果 |
误差 |
NVIDIA FP16 |
143.875 |
0.10875329(7×10-2%) |
ATI FP24 |
143.98242 |
0.00133329(9×10-4%) |
NVIDIA ATI PF32 |
143.98375 |
0.00000329(2×10-6%) |
虽然在图形运算中32位单精度甚至是16位半精度已经完全足够使用,但是在面向通用计算设计的GPU中,由于需要的数据量巨大,往往只有在采用双精度甚至更高精度时才能获得可靠的结果,所以更为可靠的计算精度一直是GPU设计者不断追求的目标。但是精度提高意味着运算速度的下降,所以每一代GPU架构更新都意味着更大的寄存器和内部实现方式在高精度运算中能够获得更好的加速比。
- 第1页:全文导读与内容简介
- 第2页:前言:通过GPU见证行业变革
- 第3页:第一章:GPU工作原理与并行计算
- 第4页:21世纪视觉需求与GPU变化
- 第5页:从山峰渲染了解GPU图形流水线
- 第6页:CPU与GPU的设计方向决定运算能力
- 第7页:GPU并行编程为何加速发展
- 第8页:GPU并行计算已成未来趋势
- 第9页:初识高性能并行计算
- 第10页:高性能并行计算发展历程
- 第11页:高性能并行计算单元分类
- 第12页:初识基于GPU系统的云计算
- 第13页:第二章:GPU结构与ATI产品发展
- 第14页:统一着色器架构释放GPU运算能力
- 第15页:传统GPU发展与着色器管线
- 第16页:传统SIMD结构流处理器指令细节
- 第17页:MIMD结构流处理器指令细节
- 第18页:R600时代对SIMD架构补充与优化
- 第19页:两种结构流处理器优劣对比
- 第20页:R300以来的芯片架构及其影响
- 第21页:ATI第一代统一渲染架构Xenos
- 第22页:统一渲染GPU R600临危受命
- 第23页:AMD对GPU架构的不断改进和优化
- 第24页:未来ATI图形芯片架构预测
- 第25页:第三章:GPU通用计算发展与细节
- 第26页:多核并行计算困惑与发展
- 第27页:基于AMD CPU+GPU异构计算平台
- 第28页:着色器模型变化历程与总结
- 第29页:Shader计算能力快速发展
- 第30页:揭秘GPU高性能计算关键
- 第31页:CPU与GPU的区别和发展方向
- 第32页:如何将GPU功能单元映射为通用单元
- 第33页:分支对GPU结构体系的挑战
- 第34页:GPU与CPU将如何演绎融合与吞并
- 第35页:第四章:GPU内部计算实现细节
- 第36页:GPU主要计算单元分布和职能
- 第37页:GPU内部通用计算代码运算过程
- 第38页:认识GPU浮点计算精度
- 第39页:整数运算能力与未来融合架构
- 第40页:GPU存储体系特点与变化
- 第41页:ATI GPU吞吐特性对比与分析
- 第42页:ATI GPU OPEN CL综合性能分析
- 第43页:先进混合架构之Larrabee展望
- 第44页:概念型融合架构之Fusion APU展望
- 第45页:GPU进化架构之Fermi分析
- 第46页:第五章:ATI GPU通用计算实例
- 第47页:ATI Stream技术发展与现状
- 第48页:OPEN CL接口技术与异构运算
- 第49页:Havok引擎与CPU+GPU异构运算
- 第50页:BOINC平台充沛的ATI GPU加速项目
- 第51页:最具影响力的Folding@home项目
- 第52页:GPU架构对于其他实例的适应性
- 第53页:全文总结与未来架构展望