2013-04-09 102 views
0

我有以下模板__device__功能CUDA:訪問CUDA庫函數內的__device__函數模板專門實例

template<typename T> 
__device__ void MyatomicAdd(T *address, T val){ 
atomicAdd(address , val); 
} 

,編譯,如果有T實例化爲浮點運行良好,即

__global__ void myKernel(float *a, float b){ 
MyatomicAdd<float>(a,b); 
} 

將運行沒有問題。

我想專精這個功能,因爲雙打沒有atomicAdd(),所以我可以用雙精度手工編寫一個實現。忽略對於現在的雙精度專業化,單精度專業化和模板是這樣的:

template<typename T> 
__device__ void MyatomicAdd(T *address, T val){ 
}; 


template<> 
__device__ void MyatomicAdd<float>(float *address, float val){ 
atomicAdd(address , val); 
} 

現在,編譯器抱怨atomicAdd()是我的專業化不確定的,這同樣適用,當我嘗試使用任何CUDA功能如專業化中的__syncthreads()。有任何想法嗎?謝謝。

+1

聽起來像你正試圖用錯誤的編譯器編譯專業化。你真的使用nvcc,並且正在編譯的文件是否具有.cu擴展名? – talonmies 2013-04-09 10:33:45

+0

第一個未特例和第二個特例都存在於同一個文件中。在我寫第二個例子後,我剛剛評論了第一個例子。這似乎是專業化的一個具體問題。 – mjm26 2013-04-09 16:57:42

+0

問題是我可以把你發佈的代碼放在一個帶有內核的文件中,用nvcc進行編譯並且沒有錯誤。所以有一些不同,你忽略告訴我們.. – talonmies 2013-04-09 18:23:23

回答

0

它最終成爲與同事開發的一些OpenGL代碼的鏈接問題。迫使專業化內聯解決問題,但顯然不是根本原因。不過,現在它會做,直到我可以被困擾挖掘其他人的代碼。