遭遇破窗理论
昨天學姐運行我的程序,結果總是不對,原本以為注釋掉幾條語句就可以,結果直接崩了。
因為是GPU程序,而我沒辦法使用EmuDebug,所以只能一點點注釋來查錯。剛開始學CUDA,真的不知道如何是好。這個錯誤隱約見過,我覺得是內存訪問越界,可是又不明白,為什么在計算了那么多次之后才越界。
昨晚百思不得其解,今天早上爬起來繼續(xù)看代碼的時候發(fā)現,從一維索引轉二維索引有錯誤,改過來之后,終于沒有再崩潰了。以前沒有發(fā)現,是因為網格剛好比較標準。
雖然能運行了,但結果還是不對。我猜測會不會主機端一個函數有問題,之前是一維訪問判斷邊界,有些復雜。我改成二維數組的訪問方式,于是對了。
這個BUG所造成的效果之前也有看到,布料略微扭曲。只是當時完全不知道為什么會這樣,所以也就沒管。沒想到直接崩了,正好把元兇揪了出來。
?
之前寫GPU端碰撞檢測的時候也有遇到問題,我發(fā)現有幾組數據,每個線程都會對其進行運算,這樣很浪費時間,所以就改成了先由幾個線程計算出來,放入共享內存中,如此就都可以訪問了。
結果程序不但沒快,反而算出來錯誤的結果。我一直不明所以,找了很久也沒找出錯誤來,就將代碼都改回去了。
直到后來布料網格數增加,程序直接崩潰了。我上網搜錯誤,發(fā)現是共享內存申請超過了GPU允許的上限。這才發(fā)現,共享內存由每個block內的線程共用,而我之前,把它當做全局的內存來申請了。
這樣一想,之前的錯誤也就找出原因了。我只有第一個block內的線程計算了這幾組數據,而其他block的線程是無法訪問的。只是由于共享內存大小還沒超出限制,所以沒有提示出錯。
??
想起看程序員修煉之道時的一段話,這正是所謂的破窗理論。一棟大樓破了一扇窗,沒有去修理。大家看到了,會紛紛擲石子打破窗戶來玩。最終大樓會變得破敗不堪。當程序有一些小問題的時候,我并沒有去管他,直到后來系統(tǒng)崩潰了,回過頭來才發(fā)現,這些看似不起眼的小問題背后隱藏著的是很深的隱患。我總以為這些是莫名其妙的錯誤,其實都有根據可循。
??
現在程序依然有些問題,只是達到了注釋掉幾條語句就可以的效果,想要少注釋一些卻又不行了。這次調了很久,還是想破了腦袋也想不明白。原本想這次不要再被破窗理論控制,可心有余而力不足。想來還是我經驗不足,查錯誤只能靠猜,猜來猜去浪費了很多時間。
如今該猜的都猜過了,我只能想要不要把所有的一維索引都換成二維,或者干脆把代碼移到CPU上來調試,只是現在手頭的活要干不完了,所以不能再管這段舊代碼。還是先記下來,等以后閑暇的時間再看吧。
轉載于:https://www.cnblogs.com/luluathena/archive/2010/09/03/1817084.html
總結
- 上一篇: D3DCOLOR与D3DXCOLOR
- 下一篇: FCKeditor的开发精简