每当我运行包含这些行的脚本时:
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 存储库中可用,其中进行了许多分配。
您尝试执行的操作不起作用,因为您的代码尝试从主机访问您在设备上分配的内存。您无法访问主机上的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);
即首先在主机内存中构建指针的最终设备数组的副本,然后将其复制到设备。