CUDA實踐指南(七)

2021-09-21 03:33:19 字數 1203 閱讀 8790

數值精度和精度:

由於計算和儲存浮點值的方式,導致錯誤或意外的結果主要來自浮點精度問題。 以下各節介紹了感興趣的主要專案。 「cuda c程式設計指南的特性和技術規範」以及有關浮點精度和效能的***和附帶網路研討會中提供了浮點運算的其他特性,可從獲得精密performancefloating-點和ieee-754符合,nvidia的gpu。

single vs. double precision:

浮點數學不關聯:

每個浮點算術運算都涉及一定數量的捨入。 因此,算術運算的執行順序非常重要。 如果a,b和c是浮點值,則(a + b)+ c不能保證等於a +(b + c),因為它在符號數學中。 並行化計算時,可能會改變操作順序,因此並行結果可能與順序結果不匹配。 此限制不是cuda特有的,而是浮點值平行計算的固有部分。

提公升雙精度和截斷單精度:

在比較主機和裝置之間的浮點變數計算結果時,請確保在主機上以雙倍精度進行的提公升不考慮不同的數值結果。 例如,如果**段:

float a;

...a = a*1.02;

在計算能力為1.2或更低的裝置上執行,或者在具有計算能力1.3但在不啟用雙精度(如上所述)的情況下編譯的裝置上執行,則乘法將以單精度執行。 但是,如果**是在主機上執行的,文字1.02將被解釋為doubleprecision數量,並且會被提公升為雙精度,乘法將以雙精度執行,結果將被截斷為float - 從而 產生稍微不同的結果。 但是,如果文字1.02被替換為1.02f,則結果在所有情況下都是相同的,因為不會公升級為精度。 為確保計算使用單精度算術,總是使用浮點文字。

除了準確性之外,雙精度和浮點數之間的轉換(反之亦然)對效能有不利影響,正如指令優化中所討論的。

符合ieee 754標準:

所有cuda計算裝置都遵循ieee 754標準的二進位制浮點表示法,但有一些小例外。 這些例外(詳見cuda c程式設計指南的特性和技術規格)可能導致與主機系統上計算的ieee 754值不同的結果。

其中乙個主要區別是融合乘加(fma)指令,它將乘加操作組合成單個指令執行。 其結果通常與分別進行兩項操作所獲得的結果略有不同。

x86 80位計算:

執行浮點計算時,x86處理器可以使用80位雙精度擴充套件精度。 這些計算的結果可能會與cuda裝置上執行的純64位操作有所不同。 為了在值之間獲得更接近的匹配,請將x86主機處理器設定為使用常規雙精度或單精度(分別為64位和32位)。 這是通過fldcw x86彙編指令或等效的作業系統api完成的。

CUDA實踐指南(十六)

共享記憶體啟用塊中線程之間的協作。當乙個塊中的多個執行緒使用全域性記憶體中的相同資料時,共享記憶體只能用於從全域性記憶體訪問一次資料。共享記憶體還可以用來避免未合併的記憶體訪問,方法是從全域性記憶體中載入和儲存合併模式的資料,然後將其重新排列在共享記憶體中。除了儲存體衝突之外,共享記憶體中的變形對非...

CUDA實踐指南(十三)

裝置記憶體空間 cuda裝置使用多個記憶體空間,這些記憶體空間具有不同的特性,這些特性反映了它們在cuda應用程式中的不同用法 這些記憶體空間包括全域性,本地,共享,紋理和暫存器,如圖2所示 合併的訪問要求取決於裝置的計算能力,可以查閱cuda c程式設計指南中。在這些不同的記憶空間中,全域性記憶是...

CUDA實踐指南(九)

頻寬 頻寬 資料可以傳輸的速率 是效能最重要的門控因素之一。的幾乎所有變化都應該在它們如何影響頻寬的情況下進行。頻寬可能會因資料儲存的記憶體選擇,資料布局方式以及訪問順序以及其他因素而受到顯著影響。要準確測量效能,計算理論和有效頻寬非常有用。當後者遠低於前者時,設計或實現細節可能會降低頻寬,並且應該...