2d char数组到CUDA内核

我需要帮助将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 <<>> (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

感谢帮助。

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

一般而言,在主机和设备之间移动任意双指针Carrays比单指针arrays更复杂。

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

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

你的扁平代码看起来像这样:(你提供的代码是一个无法编译的,不完整的代码片段,所以我的代码也是如此)

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

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

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

但是,您可以使用cuPrintf

我们如何使用cuPrintf()?