c++ - 在模板函数内部调用时,cudaMalloc 不修改返回指针

标签 c++ templates cuda nvcc

以下示例问题:

#include <iostream>

using namespace std;
__device__ __constant__ float* data;

template<class T> void allocOnly(T* deviceDest, size_t numElem)
{
    cudaError_t errCode = cudaMalloc((void**)&deviceDest, numElem*sizeof(T));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
}

int main()
{
    float* test(0);
    allocOnly<float>(test,10);
    cout << "test = " << test << endl;

    float* test2(0);    
    cudaError_t errCode = cudaMalloc((void**)&test2, 10*sizeof(float));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
    cout << "test2 = " << test2 << endl;

    return 0;
}

nvcc test.cu -o testBin编译

返回

test = 0
test2 = 0x310100

为什么通过模板函数调用时test没有被修改,cudaMalloc应该修改为指向新分配的设备内存的指针!

最佳答案

指针未被修改,因为函数 allocOnly 中的 cudaMalloc 正在将内存分配给函数 deviceTest 的参数仅分配。您可以修改函数 allocOnly 来分配内存,如下所示:

template<class T> void allocOnly(T** deviceDest, size_t numElem)
{
    cudaError_t errCode = cudaMalloc((void**)deviceDest, numElem*sizeof(T));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
}

主函数内部:

int main()
{
    float* test(0);
    allocOnly<float>(&test,10);
    cout << "test = " << test << endl;
    .
    .
    .

}

关于c++ - 在模板函数内部调用时,cudaMalloc 不修改返回指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715584/

相关文章:

CUDA:sum[0] 的值随每次执行而变化

c++ - 用于 ssh 和 scp 的面向对象的 C++ 库

c++ - 如何在 C++ 中将外部类的模板类型用作内部类中的字段?

c++ - 什么会导致 Windows 发送两次 ID_HELP 命令

c++ - 模板类可以在 C++ 中具有静态成员吗

c++ - 在 std::pair 支撑初始化中复制 vs move

c++ - 为什么允许通过基类的指针调用派生类的私有(private)虚方法?

c++ - 为 void 参数特化一个模板

c - 使用 cudaBindTexture2D 将二维数组绑定(bind)到 GPU 的纹理内存会产生错误

cuda - 如何使用 CUDA C 快速重新分组/透视数据?