OpenCL: ядро ​​считывает интерполированное значение из образа INT_16 - PullRequest
0 голосов
/ 29 октября 2018

Я использую ядро, которое принимает INT_16 изображение в качестве ввода.

Я пытаюсь прочитать интерполированные значения из этого изображения, используя сэмплер, объявленный с CLK_FILTER_LINEAR .

У меня правильные значения с использованием метода read_imagei : например, если я читаю между пикселем «200» и пикселем «300», я получаю результат «220» (в зависимости от координат чтения)

Теперь я пытаюсь читать, используя read_imagef значения, чтобы получить более точные значения:

  • изображение объявлено как CL_SNORM_INT16
  • сэмплер объявлен с использованием CLK_FILTER_LINEAR
  • считанные значения умножаются на 32767.0f (для преобразования из диапазона [-1.0; +1.0] CL_SNORM_INT16 в диапазон INT_16)

Здесь я могу прочитать те же значения, что и раньше (используя read_imagei).

Но я никогда не получаю значения, такие как "220.56" или "220.76", я всегда получаю округленные значения. Точно так же, как если бы внутренняя интерполяция на GPU была вычислена с использованием регистров INT_16, а не регистров с плавающей запятой.

Я не видел ничего в спецификации OpenCL о том, как следует вычислять интерполяцию между значениями INT_16.

Вопрос:

Нормально ли всегда получать округленные значения, а не значения с плавающей запятой при использовании read_imagef из CL_SNORM_INT16 изображения, сэмплированного в режиме CLK_FILTER_LINEAR ?

(мне нужно использовать изображение INT_16 для ограничения использования памяти, но я хотел бы иметь точность точек с плавающей точкой в ​​результатах интерполяции)

1 Ответ

0 голосов
/ 29 октября 2018

Да, это поведение в спецификации OpenCL, хотя оно может отличаться в разных реализациях. Соответствующей частью спецификации является примечание в самом конце Режимы адресации и фильтрации , в котором также есть обходной путь для получения желаемого поведения:

Для всех других комбинаций сэмплеров нормализованных или ненормализованных координат, режимов фильтрации и адресации, относительная погрешность или точность расчетов в режиме адресации и работа фильтра изображения не определяются в этой редакции спецификации OpenCL. Чтобы обеспечить минимальную точность адресации изображения и вычислений фильтра на любом устройстве OpenCL, для этих комбинаций сэмплеров разработчики должны ненормализовать координату изображения в ядре и реализовать линейный фильтр в ядре с соответствующими вызовами read_image {f | i | ui} с сэмплером, который использует ненормализованные координаты, режим фильтра установлен на CLK_FILTER_NEAREST, режим адресации установлен на CLK_ADDRESS_NONE, CLK_ADDRESS_CLAMP_TO_EDGE или CLK_ADDRESS_CLAMP и, наконец, выполняет интерполяцию значений цвета, считанных из изображения, для генерации отфильтрованного значения цвета.

...