gpt4 book ai didi

c++ - 二维字符数组到 CUDA 内核

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:47 25 4
gpt4 key购买 nike

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

感谢您的帮助。

最佳答案

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

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

如果您真的想处理双指针数组,请搜索本页右上角的“CUDA 二维数组”,您会找到各种操作示例。 (比如@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);
}

如果你想要一个倾斜的数组,你可以用类似的方式创建它,但你仍然会以单指针数组的形式创建它,而不是双指针数组。

关于c++ - 二维字符数组到 CUDA 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19459788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com