cuda 1.x 編譯器產生的奇怪問題及解決方法

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的卡。

重新編譯、運行,問題解決。

 

 

 

發佈了48 篇原創文章 · 獲贊 81 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章