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

标签 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 来说是必须要做的

最佳答案

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

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

关于templates - 使用 C++ 模板分配 CUDA 设备内存时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11554458/

相关文章:

c++ - 指向 const 类型的 const 指针的模板特化

cuda - CUBLAS 中的异步和内存所有权

python - 如何在带有gpu的tensorflow安装中处理 `GCC`?

ubuntu - 我的 nvidia 驱动程序的正确 CUDA 版本是什么?

c++ - 多个参数包作为工厂函数参数

c++ - G++ 模板实例化导致 "Undefined reference to"错误

multithreading - Boost::thread() 和 Nvidia CUDA 是否存在某种不兼容?

CUDA 神经网络仿真

c++ - 在 C++11 中是否可以支持不同级别的间接寻址的模板函数?

c++ - undefined reference 错误 - MPI 编译