0

データ型 cudaPitchedptr 内で配列を使用しようとしたときに問題が発生しました。メイン関数からグローバル関数にデータを転送し、値を出力しました。ただし、cudaMemset3D で値を 12 に設定したため、出力される結果は 0.0000 です。添付は私のコードです。誰かが私を助けることができれば、本当に感謝しています。

 #include "cuda_runtime.h"
 #include "device_launch_parameters.h"
 #include "cuPrintf.cu"
 #include "stdio.h" 
 __global__ void printtest(double devptr[])
{

printf("%f\n",devptr[1]);
}




int main()
{

int width=191, height=192, depth=192;
cudaExtent extent= make_cudaExtent( width*sizeof(double),height,depth);
cudaPitchedPtr Ex;
cudaMalloc3D(&Ex,extent);

cudaMemset3D(Ex,12 ,extent);

printtest<<<1,1>>>( (double*) Ex.ptr);
}
4

1 に答える 1

3

問題は、範囲内のすべてのバイトを値に設定するためにcudaMemset3Dが使用されることです。説明の注:

value - 指定されたメモリの各バイトに設定する値

したがって、割り当てられた領域のすべてのバイトを 12 (10 進数) に設定しています。次に、これらのバイトを 8 つ続けて取得し、それを倍精度浮動小数点型として解釈しようとしています。期待していない結果が得られます。

賢明なものを見たい場合はcudaMalloc3D、 の代わりに の後に、次のcudaMemset3Dコードを挿入します。

  double myval = 1.3579f;  //or whatever value you want to see
  double *hostdata;
  hostdata = (double *)malloc(width*sizeof(double)* height*depth);
  if (hostdata == 0) {printf("malloc fail"); return 1;}
  hostdata[1] = myval;
  cudaMemcpy3DParms p = {0};
  p.srcPtr = make_cudaPitchedPtr(hostdata, width*sizeof(double), width, height);
  p.dstPtr = Ex;
  p.extent = extent;
  p.srcPos = make_cudaPos(0,0,0);
  p.dstPos = make_cudaPos(0,0,0);
  p.kind=cudaMemcpyHostToDevice;
  cudaMemcpy3D(&p);

また、コード内ですべての API 呼び出しとカーネルの起動後にcuda エラー チェックを使用することをお勧めします。

この質問/回答にも興味があるかもしれません。

于 2013-04-23T04:34:44.240 に答える