CUDA 分配字符串数组



每当我运行包含这些行的脚本时:

   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);

即首先在主机内存中构建指针的最终设备数组的副本,然后将其复制到设备。

最新更新