Pro*_*mer 1 templates cuda nvidia
我已声明以下模板以缩短代码:
template <typename T>
void allocateGPUSpace(T* ptr, int size){
cudaMalloc((void**)&ptr,size * sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)
而且,我使用模板如下:
float* alphaWiMinusOne;
allocateGPUSpace<float>( alphaWiMinusOne,numUnigrams);
但是,当我编译代码时,VS 2008会发出警告
warning: variable "alphaWiMinusOne" is used before its value is set
Run Code Online (Sandbox Code Playgroud)
和
uninitialized local variable 'alphaWiMinusOne' used
Run Code Online (Sandbox Code Playgroud)
cuda不理解C++中的模板吗?天哪,这对于nvidia来说是必须的
首先,该警告不是来自CUDA,它来自主机编译器(因此Microsoft的C++编译器或GCC取决于您的平台),它是一个完全有效的警告.你使你犯同样的错误在这里,和你希望这个代码将无法正常工作,因为要传递指针的值进行操作,而不是参考.你的代码应该是这样的:
template <typename T>
void allocateGPUSpace(T ** ptr, int size){
cudaMalloc((void**)ptr, size * sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)
和这样的电话:
float * alphaWiMinusOne;
allocateGPUSpace<float>(&alphaWiMinusOne, numUnigrams);
Run Code Online (Sandbox Code Playgroud)
也许
template <typename T>
T * allocateGPUSpace(int size){
T * ptr;
cudaMalloc((void**)&ptr, size * sizeof(T));
return ptr;
}
Run Code Online (Sandbox Code Playgroud)
然后
float * alphaWiMinusOne = allocateGPUSpace<float>(numUnigrams);
Run Code Online (Sandbox Code Playgroud)
使用任何一个都将消除编译器警告,代码将起作用.作为一种风格,它将是一个相当短视的辅助功能设计,不包括任何错误检查.......