2

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

手伝ってくれてありがとう。

4

2 に答える 2

1

cudaMemcpy2Dは、実際には C の 2 次元 (つまり、ダブル ポインター**) 配列を処理しません。ドキュメントでは、ダブル ポインターではなく、シングル ポインターを想定していることに注意してください。

一般的に言えば、ホストとデバイス間で任意のダブル ポインター C 配列を移動することは、単一のポインター配列よりも複雑です。

二重ポインター配列を本当に処理したい場合は、このページの右上隅にある「CUDA 2D 配列」を検索すると、その方法のさまざまな例が見つかります。(たとえば、@talonmies の回答はこちら)

多くの場合、より簡単な方法は、単に配列を「フラット化」して、単一のポインター (つまりchar[]の代わりに) で参照できるようにしchar[][]、インデックス演算を使用して 2 次元アクセスをシミュレートすることです。

フラット化されたコードは次のようになります。

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

ピッチ付き配列が必要な場合は、同様に作成できますが、ダブル ポインター配列ではなく、シングル ポインター配列として作成します。

于 2013-10-19T06:30:47.000 に答える