2013-10-18 60 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。這個答案基本上是錯誤的。 –