CUDA 問題合集

2021-08-19 14:32:49 字數 1574 閱讀 2628

一、核函式無故退出:

可能是由於傳入的引數儲存於主機記憶體中核函式訪問不到,或者陣列越界等原因。

例如:1、傳入了儲存於主機的結構體,無論是結構體指標還是引用;

傳入結構體引用時,除錯的時候可能發現傳入的結構體內容不正常,但是運算時卻沒有問題 。

2、傳入了主機記憶體的指標。

可以在除錯的時候進入反彙編發現該問題。

注意:傳入引數為基本型別時,不牽扯儲存於主機的問題。

二、__syncthreads()以及其他核函式__cospif()無法找到或未定義

絕對是未呼叫正確的檔案編譯器,需要更改檔案屬性,使用項型別中的cuda c++編譯。

三、cuda函式的結構

目前能夠執行的包括兩種:

1、標頭檔案中包含呼叫核函式的函式,核函式定義在原始檔中,例如:

#define nthreads 512

#define nblocks 1024

__global__ void kernsum(int ilen, int *pisum, int *pia, int *pib);

__inline__ int devsum(int ilen, int *pisum, int *pia, int *pib)

__global__ void kernsum(int ilen, int *pisum, int *pia, int *pib)

}

優點:函式內聯,編譯時直接展開

缺點:標頭檔案中定義的變數可能會被多次定義

2、標頭檔案宣告函式,原始檔定義核函式以及相應的其他函式,例如:

int devsum(int ilen, int *pisum, int *pia, int *pib)

#define nthreads 512

#define nblocks 1024

__global__ void kernsum(int ilen, int *pisum, int *pia, int *pib)

}int devsum(int ilen, int *pisum, int *pia, int *pib)

優點:標頭檔案乾淨整潔

缺點:每次都是呼叫,可能影響效率

四、工程需要呼叫cuda核函式

1、工程屬性裡更改為cuda編譯器;

2、將核函式存在的檔案以及呼叫核函式的檔案屬性改為cuda c++。注意:內聯展開的情況下,核函式可能展開到的所有檔案屬性都需要更改。也就是包含標頭檔案的所有原始檔都要使用 cuda c++屬性。

五 vs編譯時,如果無法識別出核函式呼叫(也就是三對尖括號)。

一定是該原始檔使用了c/c++編譯器,而非nvcc,在該原始檔的屬性中將編譯器改為cuda c++ 即可。

使用cudamallocmanaged()函式分配記憶體時,如果核函式呼叫之後不使用cudadevicesynchronize()同步直接訪問記憶體可能產生異常,報「**位址訪問該記憶體位址失敗」

cuda核計算資料時,按順序計算,並不提前統一所有資料型別;

例如:x=2*3/5*0.25;x結果是0.25,而不是0.3;

2017 2 18 問題合集

入坑144天 因為flex的相容性問題,導致 臃腫,重新優化了樣式表,簡單的居中問題不再使用flex屬性。同時也學會了如何處理flex相容性的問題 a display moz box display webkit box display webkit flex 新版本語法 chrome 21 dis...

QT Creator 問題合集

原因 是缺少所需外掛程式的動態庫 解決辦法 將qt qt5.8.0 5.8 mingw53 32 plugins目錄下的platforms目錄複製到其程式目錄下即可。編寫時如下 實際使用時如下 解決辦法 將qt qt5.8.0 5.8 mingw53 32 plugins目錄下的imageforma...

回文問題合集

最長回文子串 最長回文子串行 最長公共子串行 最長遞增子串行 最長公共子串 回文子串行個數 設字串為str,長度為n,dp i j 表示第i到第j個字元間的回文子串行個數 i j 則 狀態初始條件 dp i i 1 i 0 n 1 狀態轉移方程 if str i str j dp i j dp i ...