做CUDA項目的一些心路歷程

做CUDA項目時的一些坑

1)要注意數據類型,在進行cudaMemcpy()的時候,要注意數據類型的統一,即使你float的數組裏存的是數據是沒有小數的整數類型,但當你想要把數據從設備端拷貝回主機端的時候,一定要new一個float類型的數組去存放。
2)要注意核函數裏,數組的索引一定不要超過範圍,否則會出現全是0的情況。特別要注意當一個數組用於存儲座標,另一個數組存放數據。用該存儲座標的數組去索引存放數據的數組時,要確保存儲的座標值不會超過數組的索引大小。
3)在進行數組從設備端到宿主端的copy時,內存大小一定要小於等於所申請的大小,不能比申請的內存大小大,不然也會出現全是0的情況,一定要謹慎。不然找一個錯誤就要找好久。。。

做CUDA項目時的一些小習慣

1)在做算法的CUDA加速時,一定要先熟悉算法,而不是根據別人的C++\C 代碼去直接翻譯成CUDA,最好的話可以看該算法的matlab版本(個人認爲matlab的代碼更直觀,而且在數據處理方面可視化程度較高),在瞭解清楚該算法後,再用並行的思想去思考該如何編寫CUDA代碼。
2)在規劃線程塊大小時,可以根據算法的內容,選擇 ‘’少線程,多寄存‘’ 或者 “多線程,少寄存器”。這完全取決於你的算法內容。
3)共享內存多用於 某些數據需要被頻繁訪問,或者數組的某些位置需要被頻繁索引到 。比如:歸約算法,同時要注意存儲體衝突(bank confilt)
若只是簡單的賦值操作,或者讀寫操作,可以直接在全局內存上操作
4)當項目裏需要插入一些固定的數據,比如一些矯正矩陣,空氣參考矩陣,可以使用頁鎖定內存,快速複製到設備端,在不使用的時候釋放頁鎖定內存,把虛擬內存放出來。
5)在利用CUDA的一些高級庫時,比如cublas,cusolver,cufft。可以去官網的工具手冊找對應的例子,還有關於函數的參數解釋,能幫助你快速的瞭解並掌握。

最後

我感覺CUDA在做一些有序的算法問題時,會很難寫(可能本人能力有限。。),但是總是會有解決的方法的,只要你對算法足夠的瞭解,人是活的嘛!
總之,你要對你要寫的東西十分熟悉,然後多利用並行思想去思考。如果可以的話,去了解GPU.CPU的硬件構成,會對你寫代碼有很大的幫助,因爲代碼最後都是要在硬件上去執行的。我對GPU的硬件感觸最深的一點就是流水化的程度很高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章