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