2013-10-18 63 views
2

我需要帮助传输char [] []到Cuda内核。这是我的代码:2d字符数组到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,代码= \ “sm_20,compute_20 \” - 使用本地-ENV 2012 --cl版本 - ccbin

回答

1

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

如果你想有一个尖锐的阵列,您同样可以创建它,但是你仍然可以做为单指针数组,而不是双指针数组。

+0

谢谢....它是完美的:) – user2802849

1

感谢您的帮助,您不能在Cuda的内核使用printf。是的原因是,代码正在对GPU而不是主机CPU来执行。

你可以,然而使用cuPrintf

How do we use cuPrintf()?

+0

我认为'printf'正常工作。我试过'printf(“Hello Cuda”)'。 – user2802849

+4

如果您针对体系结构sm20或更新版本进行编译,则可以直接在内核中使用printf。这个答案基本上是错误的。 –