【问题标题】:2d char array to CUDA kernel二维字符数组到 CUDA 内核
【发布时间】:2013-10-27 21:28:47
【问题描述】:

我需要帮助将 char[][] 转移到 Cuda 内核。这是我的代码:

__global__ 
void kernel(char** BiExponent){
  for(int i=0; i<500; i++)
     printf("%c",BiExponent[1][i]); // I want print line 1
}

int main(){
  char (*Bi2dChar)[500] = new char [5000][500];
  char **dev_Bi2dChar;

  ...//HERE I INPUT DATA TO Bi2dChar

  size_t host_orig_pitch = 500 * sizeof(char);
  size_t pitch;
  cudaMallocPitch((void**)&dev_Bi2dChar, &pitch, 500 * sizeof(char), 5000);
  cudaMemcpy2D(dev_Bi2dChar, pitch, Bi2dChar, host_orig_pitch, 500 * sizeof(char), 5000, cudaMemcpyHostToDevice);
  kernel <<< 1, 512 >>> (dev_Bi2dChar);
  free(Bi2dChar); cudaFree(dev_Bi2dChar);
}

我使用: nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2012 -ccbin

感谢您的帮助。

【问题讨论】:

    标签: c++ c cuda gpu


    【解决方案1】:

    cudaMemcpy2D 实际上并不处理 C 中的二维(即双指针,**)数组。 请注意,documentation 表示它需要单指针,而不是双指针。

    一般来说,在主机和设备之间移动任意双指针 C 数组要比单指针数组复杂。

    如果你真的想处理双指针数组,那么在这个页面的右上角搜索“CUDA 2D Array”,你会发现如何做的各种例子。 (比如@talonmieshere给出的答案)

    通常,一种更简单的方法是简单地“展平”数组,以便它可以被单个指针引用,即char[] 而不是char[][],然后使用索引算法来模拟二维访问。

    您的扁平化代码如下所示: (你提供的代码是无法编译的,不完整的sn-p,我的也是)

    #define XDIM 5000
    #define YDIM 500
    
    __global__ 
    void kernel(char* BiExponent){
      for(int i=0; i<500; i++)
         printf("%c",BiExponent[(1*XDIM)+i]); // I want print line 1
    }
    
    int main(){
      char (*Bi2dChar)[YDIM] = new char [XDIM][YDIM];
      char *dev_Bi2dChar;
    
      ...//HERE I INPUT DATA TO Bi2dChar
    
      cudaMalloc((void**)&dev_Bi2dChar,XDIM*YDIM * sizeof(char));
      cudaMemcpy(dev_Bi2dChar, &(Bi2dChar[0][0]), host_orig_pitch, XDIM*YDIM * sizeof(char), cudaMemcpyHostToDevice);
      kernel <<< 1, 512 >>> (dev_Bi2dChar);
      free(Bi2dChar); cudaFree(dev_Bi2dChar);
    }
    

    如果你想要一个有间距的数组,你可以类似地创建它,但你仍然会这样做作为单指针数组,而不是双指针数组。

    【讨论】:

      【解决方案2】:

      您不能在 Cuda 内核中使用 printf。原因是代码是在 GPU 而不是主机 CPU 上执行的。

      你可以使用cuPrintf

      How do we use cuPrintf()?

      【讨论】:

      • 我认为printf 工作正常。我试过printf("Hello Cuda")
      • 如果您为架构 sm20 或更高版本进行编译,您可以直接在内核中使用 printf。这个答案基本上是错误的。
      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 2019-06-14
      • 1970-01-01
      • 2012-02-24
      • 2021-06-12
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      相关资源
      最近更新 更多