Cuda линейная интерполяция с использованием текстур - PullRequest
0 голосов
/ 14 декабря 2011

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

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) я бы применил бинарный поиск по массиву точек и получил бы lowerBound, равный 25, и рассмотрел интерполяцию в интервале [14,25] и т. Д.

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

Есть идеи?

1 Ответ

1 голос
/ 15 декабря 2011

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

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

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

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

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

...