Линейная интерполяция Cuda с использованием текстур

У меня есть кривая следующим образом:

float points[] = {1, 4, 6, 9, 14, 25, 69};
float images[] = {0.3, 0.4, 0.7, 0.9, 1, 2.5, 5.3};

Чтобы интерполировать, скажем, f (3), я бы использовал линейную интерполяцию между 1 и 4. Чтобы интерполировать, скажем, f (15), я бы применил двоичный поиск к массиву точек и получил бы нижнюю границу, которая равна 25, и рассмотрел бы интерполяцию в интервале [14,25] и так далее..

Я обнаружил, что этот метод делает работу моего устройства очень медленной. Я слышал, что для этого можно использовать память текстур и tex1D! возможно ли, даже если точки [] не являются, скажем, однородными (увеличиваются с постоянным шагом)

Есть идеи ?


person ZeroCool    schedule 14.12.2011    source источник


Ответы (1)


Похоже, эту проблему можно разбить на две части:

  1. Используйте массив точек для преобразования значения x в f(x) в индекс с плавающей запятой от 0 до 7 (требуется двоичный поиск по точкам[])
  2. Используйте этот индекс с плавающей запятой, чтобы получить линейно интерполированное значение из массива изображений.

Память текстуры Cuda может сделать шаг 2 очень быстрым. Однако я предполагаю, что большая часть времени в вашем ядре тратится на шаг 1, и я не думаю, что память текстур может вам помочь.

Если вы еще не используете преимущества общей памяти, перемещение ваших массивов в общую память даст вам гораздо большее ускорение, чем использование памяти текстур. На новейшем оборудовании имеется 48 КБ общей памяти, поэтому, если ваши массивы меньше 24 КБ (6 КБ элементов), они оба должны помещаться в общую память. Шаг 1 может значительно выиграть от использования разделяемой памяти, потому что он требует несмежного чтения точек[], что очень и очень медленно в глобальной памяти.

Если ваши массивы не помещаются в разделяемую память, вы должны разбить свои массивы на части одинакового размера по 6 000 элементов в каждой и назначить каждую часть блоку. Пусть каждый блок считывает все точки, которые вы итерполируете, и игнорируйте точку, если она не находится в части массива points[], хранящегося в его общей памяти.

person J. Kevin Corcoran    schedule 14.12.2011