CUDA分配字符串数组

时间:2016-06-09 18:34:34

标签: arrays string cuda dynamic-memory-allocation

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

   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提供了完整的代码,其中进行了许多分配。

1 个答案:

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

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