У меня проблемы с получением текстуры поплавков.Текстура определяется следующим образом:
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.Те, кто заинтересован, могут просмотреть его в своей зоне для разработчиков, но я опубликую ответ здесь.