我已声明以下模板以缩短代码:
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来说是必须的。
答案 0 :(得分:5)
首先,该警告并非来自CUDA,它来自主机编译器(因此Microsoft的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);
使用任何一个都将消除编译器警告,代码将起作用。作为风格的一个注释,它将是一个相当短视的帮助函数设计,不包括任何错误检查.......