2012-07-19 87 views
1

我已經宣佈了下面的模板,使代碼更短分配CUDA設備內存:警告,而使用C++模板

template <typename T> 
void allocateGPUSpace(T* ptr, int size){ 

    cudaMalloc((void**)&ptr,size * sizeof(T)); 
} 

此外,我使用模板如下:

float* alphaWiMinusOne;

allocateGPUSpace<float>(alphaWiMinusOne,numUnigrams);

但是,當我編譯代碼時,VS 2008給出警告

warning: variable "alphaWiMinusOne" is used before its value is set 

uninitialized local variable 'alphaWiMinusOne' used 

不CUDA不能理解C++模板?天哪,這將是一個必須爲NVIDIA做

回答

4

首先,該警告不是來自CUDA,它來自主機編譯器(所以微軟的C++編譯器或GCC取決於你的平臺),它是一個完全有效的警告。你犯了和here相同的錯誤,而且這個代碼不會像你期望的那樣工作,因爲你正在傳遞指針,以便通過值操作,而不是通過引用。您的代碼應該是這樣的:

template <typename T> 
void allocateGPUSpace(T ** ptr, int size){ 
    cudaMalloc((void**)ptr, size * sizeof(T)); 
} 

像這樣的電話:

float * alphaWiMinusOne; 
allocateGPUSpace<float>(&alphaWiMinusOne, numUnigrams); 

或許

template <typename T> 
T * allocateGPUSpace(int size){ 
    T * ptr; 
    cudaMalloc((void**)&ptr, size * sizeof(T)); 
    return ptr; 
} 

然後

float * alphaWiMinusOne = allocateGPUSpace<float>(numUnigrams); 

無論使用將消除編譯器警告和代碼將會工作。作爲風格的一個筆記,這將是一個相當短視的幫手功能設計,不包括任何錯誤檢查.......