如何在C ++ CUDA中将动态内存分配给设备指针变量

时间:2019-10-24 06:10:50

标签: c++ cuda

所有程序员。 我正在将现有的C ++项目转换为CUDA增强程序。 我是CUDA的新手。所以我在工作中学习。 我必须将内存分配给动态struct成员变量,并将struct变量分配为设备变量。

像这样:

_cuda_params* dcuda_params;

cudaMalloc(&dcuda_params, sizeof(_cuda_params));

cudaMemcpy((void *)dcuda_params, (void*)cuda_params, sizeof(_cuda_params), cudaMemcpyHostToDevice);

dcuda_params->DPht = (hashtb_entry *)malloc(c);  // c is size to allocate.

但是在运行时,我得到异常0xC0000022。 我也尝试过:

cudaMalloc(&dcuda_params->DPht, c);

,但结果相同。 我该如何处理?

.h file
    typedef struct {
        int blocksPerGrid;
        int threadsPerBlock;
        uint64_t HASH_SIZE;
        hashtb_entry* DPht;
    } _cuda_params;

.cu file

void _GpuSearch(_cuda_params* cuda_params){
...
        _cuda_params* dcuda_params;
        cudaMalloc(&dcuda_params, sizeof(_cuda_params));
        cudaMemcpy((void *)dcuda_params, (void*)cuda_params, sizeof(_cuda_params), 
        cudaMemcpyHostToDevice);
        dcuda_params->DPht = (hashtb_entry *)malloc(c); //c: size to allocate.
...
}

1 个答案:

答案 0 :(得分:1)

您要取消引用设备指针dcuda_params->DPht = (hashtb_entry *)malloc(c);不允许这样做,因为主机无法访问设备内存。

解决问题的简单方法是不使用指向结构实例的指针。无论如何,您都没有使用它的数组。因此,函数调用更改为:

void _GpuSearch(_cuda_params cuda_params)

假设cuda_params不再是指针,您可以简单地做到:

cudaMalloc(&cuda_params.DPht , sizeof(hashtb_entry));

从现在开始,您可以通过 value cuda_params传递给内核。然后,如果需要,您可以从主机复制到cuda_params.DPht