2012-07-19 52 views
1

我已经宣布了下面的模板,使代码更短分配CUDA设备内存:警告,而使用C++模板

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做

回答

4

首先,该警告不是来自CUDA,它来自主机编译器(所以微软的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); 

无论使用将消除编译器警告和代码将会工作。作为风格的一个笔记,这将是一个相当短视的帮手功能设计,不包括任何错误检查.......