1

CUDA C で 3D テクスチャからデータをフェッチしようとしていますが、関数呼び出し tex3D() は常にゼロを返します。関連するコードは次のとおりです。

ホスト:

#define L 64
typedef uint2 splitspin_t;
texture<splitspin_t, 3> texRef;

cudaArray *arrayPointer;
cudaExtent LLLextent = make_cudaExtent(L, L, L);    
cudaChannelFormatDesc cf = cudaCreateChannelDesc<splitspin_t>();
cudaChk(cudaMalloc3DArray( &arrayPointer, &cf, LLLextent ));

cudaMemcpy3DParms params = {0};
params.extent = LLLextent;
params.kind = cudaMemcpyHostToDevice;

params.srcPtr.ptr = h; // size L*L*L*sizeof(splitspin_t) allocated by malloc
params.srcPtr.pitch = sizeof(splitspin_t) * L;
params.srcPtr.xsize = L;
params.srcPtr.ysize = L;
params.srcPos.x = 0;
params.srcPos.y = 0;
params.srcPos.z = 0;

params.dstArray = arrayPointer;
params.dstPos.x = 0;
params.dstPos.y = 0;
params.dstPos.z = 0;

cudaChk(cudaMemcpy3D( &params ));

texRef.normalized = 0;                     
texRef.filterMode = cudaFilterModePoint;      
texRef.addressMode[0] = cudaAddressModeClamp; 
texRef.addressMode[1] = cudaAddressModeClamp;
texRef.addressMode[2] = cudaAddressModeClamp;
cudaChk(cudaBindTextureToArray( texRef, arrayPointer, cf ));

cudaFreeArray(arrayPointer);

デバイス:

 #define GX (threadIdx.x + blockIdx.x*blockDim.x)
 #define GY (threadIdx.y + blockIdx.y*blockDim.y)
 #define GZ (threadIdx.z + blockIdx.z*blockDim.z)

 printf("%lX %lx\n", tex3D(texRef, GX, GY, GZ).y, tex3D(texRef, GX, GY, GZ).x); // always prints zeros

h が指すメモリが非ゼロで初期化されていることを確認しました。また、最初の cudaMemcpy3D の後に h をゼロに設定し、2 番目の cudaMemcpy3D で arrayPointer から h にコピーし、h に以前と同じデータが含まれていることを確認することで、cudaMemcpy3D が成功したことも確認しました。おそらく、非標準型 (uint2) を使用していたことが原因である可能性もあると思いましたが、splitspin_t を float に typedef しても問題は解決しませんでした。

したがって、cudaBindTextureToArray 関数呼び出しが疑われますが、その時点までに犯した間違いは見当たりません。

前もって感謝します。

4

1 に答える 1