2

我已经声明了以下模板以使代码更短:

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++ 中的模板吗?天哪,这对英伟达来说是必须做的

4

1 回答 1

7

首先,该警告不是来自 CUDA,而是来自主机编译器(因此 Microsoft 的 C++ 编译器或 GCC 取决于您的平台),这是一个完全有效的警告。您犯了与此处相同的错误,并且此代码不会像您希望的那样工作,因为您传递的是按值而不是按引用进行操作的指针。你的代码应该是这样的:

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

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

于 2012-07-19T06:47:03.967 回答