CUDA实践指南(六)
得到正確答案:
獲得正確答案顯然是所有計(jì)算的主要目標(biāo)。 在并行系統(tǒng)上,可能會遇到傳統(tǒng)的面向串行編程通常不會遇到的困難。 其中包括線程問題,由于計(jì)算浮點(diǎn)值的方式而導(dǎo)致的意外值,以及由于CPU和GPU處理器運(yùn)行方式的不同而帶來的挑戰(zhàn)。 本章檢查可能影響返回?cái)?shù)據(jù)正確性的問題并指出適當(dāng)?shù)慕鉀Q方案。
驗(yàn)證:
參考比較:
對任何現(xiàn)有程序進(jìn)行修改的正確性驗(yàn)證的關(guān)鍵方面是建立一些機(jī)制,從而可以將來自代表性輸入的先前已知的良好參考輸出與新結(jié)果進(jìn)行比較。 在做出每個(gè)更改后,確保結(jié)果匹配使用適用于特定算法的任何標(biāo)準(zhǔn)。 有些人會期望逐位相同的結(jié)果,這并不總是可能的,特別是在涉及浮點(diǎn)算術(shù)的情況下; 有關(guān)數(shù)字精度的數(shù)值精度和精度。 對于其他算法,如果實(shí)現(xiàn)在某個(gè)小的epsilon中與參考匹配,則可以認(rèn)為它們是正確的。
請注意,用于驗(yàn)證數(shù)值結(jié)果的過程也可以輕松擴(kuò)展以驗(yàn)證性能結(jié)果。 我們希望確保我們所做的每一項(xiàng)改變都是正確的,并且改善了性能(以及改善了多少)。 經(jīng)常檢查這些東西是我們周期性APOD過程的一個(gè)組成部分,這將有助于確保我們盡快達(dá)到預(yù)期結(jié)果。
單元測試:
上述參考比較的一個(gè)有用的對應(yīng)部分是以這樣一種方式構(gòu)造代碼本身,即在單元級別上容易驗(yàn)證。 例如,我們可以將我們的CUDA內(nèi)核編寫為許多簡短的__device__函數(shù)的集合,而不是一個(gè)龐大的單一__global__函數(shù); 每個(gè)設(shè)備功能都可以獨(dú)立測試,然后將它們連接在一起。
例如,除了實(shí)際的計(jì)算之外,許多內(nèi)核都具有用于訪問存儲器的復(fù)雜尋址邏輯。 如果我們在引入大量計(jì)算之前單獨(dú)驗(yàn)證我們的尋址邏輯,那么這將簡化后面的調(diào)試工作。 (請注意,CUDA編譯器認(rèn)為任何設(shè)備代碼都不會將全局內(nèi)存寫入全局內(nèi)存作為需要消除的死代碼,所以我們必須至少將全局內(nèi)存寫入某些內(nèi)容,以便成功應(yīng)用我們的尋址邏輯 這個(gè)策略。)
更進(jìn)一步,如果大多數(shù)函數(shù)被定義為__host__ __device__而不僅僅是__device__函數(shù),那么這些函數(shù)可以在CPU和GPU上進(jìn)行測試,從而增加了我們對函數(shù)是正確的信心,并且不會有任何意外 結(jié)果的差異。 如果有差異,那么這些差異會很早就看出來,并且可以在一個(gè)簡單的功能的背景下理解。
作為一種有用的副作用,如果我們希望在應(yīng)用程序中包含CPU和GPU執(zhí)行路徑,則此策略將允許我們采用一種方法來減少代碼重復(fù):如果我們的CUDA內(nèi)核的大部分工作都在__host__ __device__函數(shù)中完成,那么我們 可以輕松地從主機(jī)代碼和設(shè)備代碼中調(diào)用這些功能而不會重復(fù)。
總結(jié)
以上是生活随笔為你收集整理的CUDA实践指南(六)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品经理常用工具有哪些?哪些产品经理工具
- 下一篇: LAMP+LNMP(三)Apache(h