Получение проблем с текстурой CUDA - PullRequest
2 голосов
/ 25 апреля 2011

У меня проблемы с получением текстуры поплавков.Текстура определяется следующим образом:

texture<float, 2, cudaReadModeElementType> cornerTexture;

Привязка и настройки параметров:

cornerTexture.addressMode[0]    = cudaAddressModeClamp;
cornerTexture.addressMode[1]    = cudaAddressModeClamp;
cornerTexture.filterMode        = cudaFilterModePoint;
cornerTexture.normalized        = false;
cudaChannelFormatDesc cornerDescription = cudaCreateChannelDesc<float>();


cudaBindTexture2D(0, &cornerTexture, cornerImage->imageData_device, &cornerDescription, cornerImage->width, cornerImage->height, cornerImage->widthStep);

height и width - размеры двух измерений в терминах чиселэлементов.widthStep по количеству байтов.Доступ в ядре происходит следующим образом:

thisValue = tex2D(cornerTexture, thisPixel.x, thisPixel.y);
printf("thisPixel.x: %i thisPixel.y: %i thisValue: %f\n", thisPixel.x, thisPixel.y, thisValue);

thisValue всегда должен быть неотрицательным числом с плавающей запятой.printf() дает мне странные, бесполезные значения, которые отличаются от того, что на самом деле хранит линейная память.Я пытался компенсировать доступ с помощью 0.5f по обеим координатам, но это дает мне одинаковые неверные результаты.

Есть идеи?

Обновление Кажется, что естьскрытое требование выравнивания.Из того, что я могу сделать вывод, шаг, передаваемый в функцию cudaBindTexture, должен быть кратным 32 байтам.Например, следующее дает неверные результаты

cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 10, 32, 40)

при извлечении текстуры, но следующее (тот же массив с переключенной шириной и высотой) работает хорошо:

cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 32, 10, 128)

I 'Я не уверен, что я что-то упустил или действительно есть ограничение на высоту.

Обновление 2: Я отправил отчет об ошибке в Nvidia.Те, кто заинтересован, могут просмотреть его в своей зоне для разработчиков, но я опубликую ответ здесь.

Ответы [ 3 ]

3 голосов
/ 01 мая 2011

Определенно есть ограничение на высоту тона, и, к сожалению, нет запроса свойств устройства, чтобы спросить CUDA, что это такое.

Но если вы выделяете память с помощью cudaMallocPitch() и используете переданную высоту тона,это гарантированно работает.

2 голосов
/ 03 мая 2011

Nvidia ответ на сообщение об ошибке:

"Проблема в том, что память, привязанная к 2D-текстуре, не имеет надлежащих ограничений выравнивания. Оба базовых смещения памяти текстурыи высота тона имеют определенные ограничения выравнивания, зависящие от HW, однако в настоящее время в API CUDA мы выставляем ограничение базового смещения только как свойство устройства, а не ограничение тона.

Ограничение тона будет устраненов будущем выпуске CUDA. Между тем, рекомендуется, чтобы приложения использовали cudaMallocPitch() при выделении тональной памяти, чтобы драйвер позаботился о соблюдении всех ограничений. "

1 голос
/ 25 апреля 2011

Получили ли вы структуру, связанную с текстурой, используя функцию cudaGetTextureReference?

Начиная с версии 3.2 Руководства по программированию NVIDIA C (стр. 32, последний абзац):

Формат, указанный при связывании текстуры со ссылкой на текстуру, должен соответствовать параметрам, указанным при объявлении ссылки на текстуру; в противном случае результаты выборки текстур не определены .

...