每当我运行包含这些行的脚本时:
char ** gpu_reads;
HANDLE_ERROR(cudaMalloc((void **)&gpu_reads, inputDim * sizeof(char *)));
for(i=0; i<inputDim; i++) {
HANDLE_ERROR(cudaMalloc((void **)&(gpu_reads[i]), (READS_LENGTH + 1) * sizeof(char)));
}
for(i=0; i<inputDim; i++) {
HANDLE_ERROR(cudaMemcpy(gpu_reads[i], reads[i], sizeof(char) * (READS_LENGTH + 1), cudaMemcpyHostToDevice));
}
第二行返回“未知错误”。我在我的程序中尝试了不同的分配(这是第一个),但没有一个工作。
这些行的目的只是分配一个数组(长度由用户固定,使用变量inputDim
字符串(固定长度)。
我尝试了不同的版本(即仅使用3个指针,1个指针......)但似乎没有任何版本......
有什么想法吗?
我的GitHub repository提供了完整的代码,其中进行了许多分配。
答案 0 :(得分:3)
您尝试执行的操作无法正常工作,因为您的代码会尝试访问您在主机上分配的内存。您无法访问主机上gpu_reads
的元素,因为它不是有效的主机内存分配。
做这样的事情:
char ** gpu_reads;
char ** gpu_reads_h = new char*[input_dim];
HANDLE_ERROR(cudaMalloc((void **)&gpu_reads, inputDim * sizeof(char *)));
for(i=0; i<inputDim; i++) {
HANDLE_ERROR(cudaMalloc((void **)&(gpu_reads_h[i]), (READS_LENGTH + 1) * sizeof(char)));
}
for(i=0; i<inputDim; i++) {
HANDLE_ERROR(cudaMemcpy(gpu_reads_h[i], reads[i], sizeof(char) * (READS_LENGTH + 1), cudaMemcpyHostToDevice));
}
HANDLE_ERROR(cudaMemcpy(gpu_reads, gpu_reads_h, inputDim * sizeof(char *), cudaMemcpyHostToDevice);
即。首先在主机内存中构建最终设备指针数组的副本,然后将其复制到设备中。