【问题标题】:Warning while allocating CUDA device memory using C++ templates使用 C++ 模板分配 CUDA 设备内存时出现警告
【发布时间】:2012-07-20 17:16:54
【问题描述】:

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

template <typename T>
void allocateGPUSpace(T* ptr, int size){

    cudaMalloc((void**)&ptr,size * sizeof(T));
}

另外,我使用的模板如下:

float* alphaWiMinusOne;

allocateGPUSpace&lt;float&gt;( alphaWiMinusOne,numUnigrams);

但是,当我编译代码时,VS 2008 会发出警告

 warning: variable "alphaWiMinusOne" is used before its value is set

uninitialized local variable 'alphaWiMinusOne' used

cuda 不理解 C++ 中的模板吗?天哪,这将是 nvidia 必须做的事情

【问题讨论】:

    标签: templates cuda nvidia


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多