我需要帮助将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
感谢您的帮助。
答案 0 :(得分:1)
cudaMemcpy2D
实际上并不处理C中的二维(即双指针,**
)数组。
请注意,documentation表示它需要单指针,而不是双指针。
一般来说,在主机和设备之间移动任意双指针C数组比单个指针数组更复杂。
如果你真的想要处理双指针数组,那么搜索本页右上角的“CUDA 2D Array”,你会发现各种如何做的例子。 (例如@talonmies here给出的答案)
通常,更简单的方法是简单地“展平”数组,以便可以通过单个指针引用它,即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);
}
如果你想要一个倾斜的数组,你可以类似地创建它,但你仍然会这样做单指针数组,而不是双指针数组。
答案 1 :(得分:-1)