私はシンプルなtexture3Dテストを行い、デバイスにデータをコピーするときに奇妙な動作が検出されました。関数cudaMemcpy3Dは、 '無効な引数'を返します。cudaMemcpy3Dの幅がバイト単位で無効ですか?
問題がcudaExtentと関連していることがわかりました。 4.0マニュアルCUDAツールキットリファレンスによればは、cudaExtentパラメータは以下の通りである:要素の高
- ワット要素の奥行き
したがって、次のようにテクスチャを準備しました。
および以下のような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パラメータをバイト単位で表現する必要がない理由?
これは私が来る結論です。リファレンスマニュアルに記載されているか、またはあなたの専門知識に基づいていますか? – pQB
これはAPIリファレンスに記載されていますが、見た場所には記載されていない可能性があります。 'cudaMalloc3Darray'ページでは、" 3D配列の場合、有効範囲の範囲は{(1、maxTexture3D [0])、(1、maxTexture3D [1])、(1、maxTexture3D [2])} "です。 'make_cudaExtent'ドキュメントは、3D配列の場合ではなく3D線形の場合に適用されるので、引数を文書化するだけなので、あいまいです。 – talonmies
ご清聴ありがとうございます。 – pQB