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()。有任何想法嗎?謝謝。
聽起來像你正試圖用錯誤的編譯器編譯專業化。你真的使用nvcc,並且正在編譯的文件是否具有.cu擴展名? – talonmies 2013-04-09 10:33:45
第一個未特例和第二個特例都存在於同一個文件中。在我寫第二個例子後,我剛剛評論了第一個例子。這似乎是專業化的一個具體問題。 – mjm26 2013-04-09 16:57:42
問題是我可以把你發佈的代碼放在一個帶有內核的文件中,用nvcc進行編譯並且沒有錯誤。所以有一些不同,你忽略告訴我們.. – talonmies 2013-04-09 18:23:23