2012-02-22 21 views
5

私はシンプルなtexture3Dテストを行い、デバイスにデータをコピーするときに奇妙な動作が検出されました。関数cudaMemcpy3Dは、 '無効な引数'を返します。cudaMemcpy3Dの幅がバイト単位で無効ですか?

問題がcudaExtentと関連していることがわかりました。 4.0マニュアルCUDAツールキットリファレンスによればは、cudaExtentパラメータは以下の通りである:要素の高

  • D - - -
  • Hバイト単位

    • ワット要素の奥行き

    したがって、次のようにテクスチャを準備しました。

    および以下のような3次元のパラメータ構成:

    // prepare input data 
    cudaMemcpy3DParms i_3DParms = { 0 }; 
    i_3DParms.srcPtr = make_cudaPitchedPtr((void*)h_idata, NCOLS*sizeof(baseType), NCOLS, NROWS); 
    i_3DParms.dstArray = i_ArrayPtr; 
    i_3DParms.extent = t_extent; 
    i_3DParms.kind  = cudaMemcpyHostToDevice; 
    

    を最後にデバイスメモリへデータをコピー:

    // copy input data from host to device 
    status = cudaMemcpy3D(&i_3DParms); 
    

    Iがx次元内の要素の数だけ指定場合、問題が解決されます

    は、任意の電子を生成しません
    cudaExtent t_extent = make_cudaExtent(NCOLS, NROWS, DEPTH); 
    

    :としてエラーと期待どおりのテスト作業。

    私はcudaExtent関数などで何かを逃しているのだろうかと思います。 widthパラメータをバイト単位で表現する必要がない理由

  • 答えて

    6

    CUDA配列の場合、エクステントは配列要素で指定された幅で指定されます。線形メモリを割り当てるために、エクステントはバイト単位で指定された幅で指定されます。 cudaMalloc3DArrayの配列を割り当てるので、要素の幅を使用します。 cudaMalloc3Dを使用していた場合、エクステントの幅はバイト単位になります。

    +0

    これは私が来る結論です。リファレンスマニュアルに記載されているか、またはあなたの専門知識に基づいていますか? – pQB

    +1

    これはAPIリファレンスに記載されていますが、見た場所には記載されていない可能性があります。 'cudaMalloc3Darray'ページでは、" 3D配列の場合、有効範囲の範囲は{(1、maxTexture3D [0])、(1、maxTexture3D [1])、(1、maxTexture3D [2])} "です。 'make_cudaExtent'ドキュメントは、3D配列の場合ではなく3D線形の場合に適用されるので、引数を文書化するだけなので、あいまいです。 – talonmies

    +0

    ご清聴ありがとうございます。 – pQB

    関連する問題