【问题标题】:Passing a pointer to device memory between classes in CUDA在 CUDA 中的类之间传递指向设备内存的指针
【发布时间】:2016-04-05 16:50:01
【问题描述】:

我会感谢一些涉及 CUDA 设备内存指针的帮助。基本上我想将我的 CUDA 内核代码拆分为多个文件以提高可读性,因为它是一个大型程序。所以我想要做的是能够将相同的设备内存指针传递给多个 CUDA 内核,而不是同时传递。以下是我需要的粗略示例

//random.h
class random{
public:
    int* dev_pointer_numbers;
};

所以对象只需要存储指向设备内存的指针

//random_kernel.cu
__global__ void doSomething(int *values){
//do some processing}

extern "C" init_memory(int *devPtr,int *host_memory,int arraysize)
{
    cudaMalloc(&devPtr,arraysize*sizeof(int));
    cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}

extern "C" runKernel(int *devPtr){
    doSomething<<<1,1>>>(devPtr);
}

和主文件:

//main.cpp
//ignoring all the details etc
random rnd;
void CUDA(int *hostArray)
{
    init_memory(rnd.dev_pointer_numbers,hostArray,10);
    runKernel(rnd.dev_pointer_numbers);
}

我知道当我使用对象指针运行内核代码时,它没有映射到设备内存中,所以这就是内核代码失败的原因。我想知道的是如何在我的主文件中存储指向设备内存中特定块的指针,以便它可以在其他 cuda 内核文件中重用?

【问题讨论】:

    标签: pointers cuda


    【解决方案1】:

    你的指针丢失了!

    检查你的 init_memory 函数:

    init_memory(int *devPtr,int *host_memory,int arraysize)
    {
      cudaMalloc(&devPtr,arraysize*sizeof(int));
      cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
    }
    

    所以你传入一个指针,此时你有一个名为 devPtr 的本地副本。然后使用指针的 本地副本 的地址调用 cudaMalloc()。当函数返回时,本地副本(在堆栈上)被销毁,因此您丢失了指针。

    试试这个:

    init_memory(int **devPtr,int *host_memory,int arraysize)
    {
      cudaMalloc(devPtr,arraysize*sizeof(int));
      cudaMemcpy(*devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
    }
    
    ...
    
    init_memory(&rnd.dev_pointer_numbers,hostArray,10);
    

    作为旁注,请考虑删除 extern "C",因为您是从 C++ (main.cpp) 调用它,所以没有意义,它只会使您的代码混乱。

    【讨论】:

    • 非常感谢,我担心会发生这种情况。我确实知道 extern "C" 是多余的,所以我稍后会删除它,再次感谢!
    • 是否可以传入对象本身而不是其成员?这样我可以将参数的数量限制为仅对象名称并在函数内引用对象指针?
    • 你的意思是把对象传给init_memory?是的,你可以这样做。您应该通过引用传递它 - 如果您打算更改任何成员,那么出于与原始问题相同的原因,即使您不打算更改成员,它也会避免复制。
    • 谢谢,我意识到我关注的是错误的问题,并且正确地传递了我的对象引用,而不是声明数组大小的整数。感谢您的宝贵帮助。
    猜你喜欢
    • 2013-04-20
    • 2020-01-01
    • 2011-07-18
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多