gpu浮点计算能力floaps_认识GPU浮点计算精度
● 認識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??茖W計數法的二進制表示是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/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架構更新都意味著更大的寄存器和內部實現方式在高精度運算中能夠獲得更好的加速比。
總結
以上是生活随笔為你收集整理的gpu浮点计算能力floaps_认识GPU浮点计算精度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataQL
- 下一篇: 学做 方玲玉 网络营销_网络营销实务教学