CUDA程式的除錯總結 不定時更新

2021-06-16 20:44:55 字數 843 閱讀 7722

1 )cuda的程式,經常犯,但是很難發現的乙個錯誤就是同步問題。

描述下例項

for (k = 0; k < n; k+=bs)

out[index+tx] = tp;

}

看看上面的**,好像沒問題。

其實當n < bs的時候上面的**是沒有問題的。但是當n大於bs的時候,每個執行緒會至少迴圈兩次,這樣問題就來了。 

假設第乙個warp的執行緒已經執行完了out的賦值,但是第二組warp還在計算那個tp,tp依賴於在shared memory中的資料,如果第乙個warp開始執行sda那一句話的話,第二個warp就會得到錯誤的資料。

雖然你有乙個同步了!

解決方法很簡單,就是在out輸出之後加乙個同步操作,當然你加到sda前面也是可以的。

補充一點,這個問題如何發現呢?只要比對下兩次執行的結果,看看是否一致,如果結果不一致,那麼就很有可能犯了同步的錯誤。

2)cuda程式第二經常犯的錯誤就是執行緒訪問視訊記憶體越界,或者共享儲存器訪問越界

如何發現這個問題呢。這種情況下,一般你的kernel不會啟動成功。如果不會啟動成功,也不一定能就是越界問題,如果你的kernel中使用了過多的共享儲存器,也不會啟動成功的。

遇到啟動不成功的時候,你首先要計算下shared memory是否超出了硬體範圍,至於硬體的shared memory有多少,你還需要查一下,我正能說,這個跟gpu的核心有關,你只要根據你的裝置計算能力取查詢就行了。

如果是因為越界,可以將kernel函式一點點注釋起來,檢視輸出結果。步步蠶食。一定會找到越界的位置。找到後自己解決就行了。

。。。未完待續。。。

c的小細節不定時總結

關於釋放空間的小細節 1 for p head p null p p next 錯誤的 段 2 free p 3for p head p null p q 多維陣列int daytab 2 13 作為變元傳遞給函式f,則f的說明 f int daytab 2 13 或f int daytab 13 ...

前端開發及使用者體驗設計的碎片知識 不定時更

前端理念 不管開發還是設計,產出物是服務於使用者,一切從使用者角度出發,再結合企業利益。1.android和ios端,關於a標籤呼叫js函式的相容問題 3.大量上下銜接,出現白色縫隙 縫隙間隔3px,解決方案 img 4.針對手機端設計,在頁面布局的佔比中,存在螢幕熱點,即 使用者視線的常落點和正常...

陣列的常用方法總結 不定時更新補充

1.reverse 翻轉陣列沒有排序功能 2.push 從尾巴處新增乙個元素 3.pop 從尾巴處刪除乙個元素 並返回所刪除的元素 3.unshift 從頭部新增乙個元素 4.shift 從頭部刪除乙個元素 並返回所刪除的元素 5.splice 從下標為幾的位置開始刪除 刪除幾個 被刪除元素需要新陣...