最新主要是改寫別人的CUDA程式。Open Source前幾版真是Bug百出,想找要好改的還要各方比較。
改寫除了解Bug外,也有一些問題要解決。
1.資源調度
最常拿到的是CUDA硬體1.3版的程式,剛好Bee又想用筆電跑,就要改成硬體1.1版。
這種狀況就要會做資源調度的程式改寫了。
2.改C++程式
Bee是C的使用者,C++不熟。不過遇到的算是原本CPU程式轉成CUDA之後造成的問題。
今天抓一個CUDA記憶體取用爆炸問題。追出來問題是長這樣:
原先使用物件只有建構函式,改寫為CUDA時,要在建構函式中取用CUDA記憶體,將資料轉到CUDA去。
後面也有其他函式使用CUDA上的資料運算。
處理單張照片時沒事,放到Webcam執行時,就產生記憶體不足。Bee也感到奇怪,1G的記憶體不夠用。
拿GPU-Z來看,真的用了1G。主要是每次處理照片,就會多出一些記憶體,是累積到爆的。
看程式還看不出問題,後來才發現,原來是建構時取用的CUDA記憶體沒釋放。
因為C++在物件使用完畢後,會自己釋放掉記憶體,所以很多人不寫解構函式。
可是改寫CUDA時,一樣在建構時取用CUDA的記憶體,自動解構時只會釋放CPU側。
而且相關的指標會釋放,在CUDA取用內的記憶體就變成沒人管的記憶體。
Bee加入解構,其內釋放CUDA記憶體,就這樣解決了。
CUDA還是用C的記憶體操作,不會自動回收。直接使用C++程式移植來的,這點還是要注意。
沒有留言:
張貼留言