1

2D テクスチャからのフェッチに問題があります

texture<float2, cudaTextureType2D, cudaReadModeElementType> tex;
// ...
assert(cudaMallocPitch(&imgcov2_device, &pitch, sizeof(ComplexFloat)*x*y*z, N*N) == cudaSuccess);
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float2>();
tex.addressMode[0] = cudaAddressModeClamp;
tex.addressMode[1] = cudaAddressModeClamp;
tex.filterMode = cudaFilterModePoint;
tex.normalized = false;
assert(cudaBindTexture2D(NULL, tex, imgcov2_device, channelDesc, x*y*z, N*N, x*y*z*N*N*sizeof(ComplexFloat)) == cudaSuccess);
// ...
tmp = ComplexFloatAdd(tmp, ComplexFloatMul(y[j + i*N], tex2D(tex, blockIdx.x * blockDim.x + threadIdx.x, threadIdx.y + j*N))); //fetch

tex2D の最後の 2 つの引数が と の範囲にある[0,x*y*z-1]と確信しています[0,N*N-1]別の投稿で、ピッチド メモリを使用することが提案されましたが、うまくいきませんでした。何か案は?怪しい部分は、x y z = 90000、N N = 32^2 の場合は失敗しないが、N N = 8^2 の場合は失敗しないことです。ComplexFloatとして型定義されていfloat2ます。フェッチのみが失敗します。

4

1 に答える 1

1

ピッチ リニア メモリを 2D テクスチャにバインドするときは、常に によって返されるピッチcudaMallocPitchを の最後の引数として使用します。cudaBindTexture2D

あなたの場合、これを行います:

cudaBindTexture2D(NULL, tex, imgcov2_device, channelDesc, x*y*z, N*N, pitch);
于 2012-12-28T11:19:20.310 に答える