为了使代码更简短,我声明了以下模板:
template <typename T>
void allocateGPUSpace(T* ptr, int size){
cudaMalloc((void**)&ptr,size * sizeof(T));
}此外,我按如下方式使用该模板:
float* alphaWiMinusOne;
allocateGPUSpace<float>( alphaWiMinusOne,numUnigrams);
然而,当我编译代码时,VS2008给出了警告
warning: variable "alphaWiMinusOne" is used before its value is set和
uninitialized local variable 'alphaWiMinusOne' usedcuda不理解C++中的模板吗?天哪,这将是英伟达的必经之路。
发布于 2012-07-19 14:47:04
首先,该警告不是来自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);使用这两种方法中的任何一种都可以消除编译器警告,代码将正常工作。作为一个风格,它将是一个相当短视的帮助器函数设计,不包括任何错误检查......
https://stackoverflow.com/questions/11554458
复制相似问题