Проблемы с CUDA Texture2D

У меня возникают проблемы с 2D-текстурой

texture tex;
// ...
assert(cudaMallocPitch(&imgcov2_device, &pitch, sizeof(ComplexFloat)*x*y*z, N*N) == cudaSuccess);
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc();
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

Я уверен, что последние 2 аргумента tex2D находятся в диапазоне [0, x * y * z-1] и [0, N * N-1] . В разделе было предложено другое сообщение для использования встроенной памяти, но мне не повезло. Есть идеи? Рыбная часть состоит в том, что она не сбой, когда x y z = 90000, N N = 32 ^ 2, но не тогда, когда N N = 8 ^ 2. ComplexFloat является typedef-ed как float2 . Исключена только выборка.

1
добавлено отредактировано
Просмотры: 1

1 ответы

When binding the pitch linear memory to 2D texture, always use the pitch returned by cudaMallocPitch as the last argument of cudaBindTexture2D

В вашем случае вы сделаете следующее:

cudaBindTexture2D(NULL, tex, imgcov2_device, channelDesc, x*y*z, N*N, pitch);
1
добавлено