我声明了以下模板以缩短代码:
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 来说是必须要做的
最佳答案
首先,该警告不是来自 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);
使用其中任何一个都可以消除编译器警告,并且代码可以正常工作。作为风格说明,这将是一个相当短视的辅助函数设计,不包括任何错误检查......
关于templates - 使用 C++ 模板分配 CUDA 设备内存时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554458/