cuda項目中編譯問題:
錯誤提示:
內存訪問越界導致啓動核函數失敗的問題。
nsight調試:nsight -> Enable CUDA memory checker,然後 nsight -> Start CUDA Debugging,開始調試,不設置斷點,vs直接指向訪存越界的語句;
即,
unsigned char *p= shared_data + i; //shared_data 爲共享內存中的數組大小爲:3*width
uchar2 gt=*(uchar2*)(p+4);
uchar2 gt2=*(uchar2*)(p+width+4); // 出錯語句,改爲下面的訪存方式,則不會報錯
//uchar2 gt2=*(uchar2*)(&shared_data[width+i+4]);
uchar2 gt3=*(uchar2*)(p+2*width+4); //奇怪的是,如果上一句出錯,則這句出錯纔對。但是這句確實沒有錯誤,讓我感到十分費解!
經多方查看請教測試,問題原因如下:
1.X的編譯器在多重指針推斷下,容易自我迷失,無法準確定位數據,這是1.x編譯器的問題。因此,如果是卡只支持1.x編譯器,那麼應該是用shared_data[i]的方式尋址。編譯器從2.0開始支持通用尋址。因此,如果卡支持高版本的編譯器,果斷更改編譯器,更改地方如下:將其中的compute_10,sm_10更改爲:compute_30,sm_10,因爲我的是3.0的卡。
重新編譯、運行,問題解決。