CUDA: накапливать данные в большую гистограмму с плавающей точкой - PullRequest
1 голос
/ 31 мая 2010

Я пытаюсь придумать, как реализовать следующий алгоритм с использованием CUDA:

Работая с большим объемом вокселей, для каждого вокселя я вычисляю индекс i и значение c. после расчета мне нужно выполнить histogram[i] += c
c - это значение с плавающей запятой, и гистограмма может содержать до 15 000 бинов.

Я ищу способ эффективно реализовать это с помощью CUDA. Первая очевидная проблема заключается в том, что с вычислительными возможностями 1.3, которые я использую, я не могу даже сделать atomicAdd() с плавающей точкой, так как я могу что-либо надежно накапливать?

Этот пример от nVidia делает что-то более простое. Гистограммы сохраняются в общей памяти (что я не могу сделать из-за ее размера), и она только накапливает целые числа. Можно ли обобщить этот подход в моем случае?

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Двухэтапный подход, вероятно, будет лучшим. Вы можете создать несколько гистограмм для подмножества вокселей и суммировать их все для глобальной гистограммы

Предполагая, что у вас N вокселей, сначала создайте глобальную память устройства размером M x 15000 (где M

Запустите cuda kernal, чтобы вычислить гистограмму числа N / M вокселей для каждого индекса потока. После того, как все потоки закончены, вы можете запустить другой cuda kernal, который суммирует гистограмму M для вашей последней гистограммы.

0 голосов
/ 31 мая 2010

Гистограмма напрямую во внешнюю память с использованием atomicAdd () будет очень неэффективной.В зависимости от диапазона вашей гистограммы вы можете рассмотреть несколько проходов через исходные данные, обновить частичную гистограмму в общей памяти, а затем записывать частичную гистограмму после каждого прохода.Пока вам не нужно делать большое количество проходов через входные данные, это должно быть намного эффективнее.Очевидно, что вы хотели бы сделать частичную гистограмму настолько большой, насколько это возможно, с учетом ограничений доступной разделяемой памяти, чтобы минимизировать количество требуемых проходов.

...