所有程序员。 我正在将现有的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.
...
}
答案 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
。