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

时间:2012-07-19 05:29:00

标签: templates cuda nvidia

我已声明以下模板以缩短代码:

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

1 个答案:

答案 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);

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