使用C++模板分配CUDA设备内存时发出警告

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来说是必须的

tal*_*ies 6

首先,该警告不是来自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)

使用任何一个都将消除编译器警告,代码将起作用.作为一种风格,它将是一个相当短视的辅助功能设计,不包括任何错误检查.......