Обобщенное преобразование Хафа в CUDA — как ускорить процесс объединения?

Как следует из названия, я работаю над небольшим личным исследованием параллельных методов компьютерного зрения. Используя CUDA, я пытаюсь реализовать GPGPU-версию преобразования Хафа. Единственная проблема, с которой я столкнулся, это процесс голосования. Я вызываю atomicAdd(), чтобы предотвратить несколько одновременных операций записи, и, похоже, я не получаю слишком много эффективности производительности. Я искал в Интернете, но не нашел способа заметно повысить производительность процесса голосования.

Любая помощь, которую вы могли бы предоставить в отношении процесса голосования, будет принята с благодарностью.


person Ronnie    schedule 19.06.2012    source источник


Ответы (2)


Я не знаком с преобразованием Хафа, поэтому здесь может помочь публикация псевдокода. Но если вы заинтересованы в голосовании, вы можете рассмотреть возможность использования встроенных инструкций CUDA для его ускорения.

Обратите внимание, что для этого требуются вычислительные возможности версии 2.0 или более поздней (Fermi или более поздней версии).

Если вы хотите подсчитать количество потоков в блоке, для которых выполняется определенное условие, вы можете просто использовать __syncthreads_count().

bool condition = ...; // compute the condition
int blockCount = __syncthreads_count(condition); // must be in non-divergent code

Если вы хотите подсчитать количество потоков в сетке, для которых условие истинно, вы можете выполнить atomicAdd

bool condition = ...; // compute the condition
int blockCount = __syncthreads_count(condition); // must be in non-divergent code
atomicAdd(totalCount, blockCount);

Если вам нужно подсчитать количество потоков в группе, меньшей, чем блок, для которого условие истинно, вы можете использовать __ballot() и __popc() (подсчет населения).

// get the count of threads within each warp for which the condition is true
bool condition = ...; // compute the condition in each thread
int warpCount = __popc(__ballot()); // see the CUDA programming guide for details

Надеюсь это поможет.

person harrism    schedule 27.06.2012
comment
Если я не ошибаюсь (тоже не эксперт по преобразованиям Хафа, так что, возможно, кто-то может подтвердить/опровергнуть), голосование здесь, по сути, представляет собой отображение всех потоков на 2D-массив/изображение. Значение, которое оно будет хранить, когда все будет завершено, по сути, представляет собой количество потоков, сопоставленных с конкретным индексом/пикселем массива. (Таким образом, атомарные числа в основном используются для +1). Я хочу сказать: я не совсем понимаю, как ваше предложение вписывается в эту идею. Имеет ли это? - person Bart; 27.06.2012
comment
В этом случае это звучит как гистограмма. Ему следует взглянуть на существующие работы по гистограммам. Также обратите внимание, что атомарные операции НАМНОГО быстрее на Кеплере. - person harrism; 28.06.2012

Совсем недавно я использовал процессы голосования...

в самом конце atomicAdd становится еще быстрее и в обоих случаях

эта ссылка очень полезна: warp-filtering

это была моя решенная проблема Записывайте данные только из выбранных дорожек в Warp, используя Shuffle + бюллетень + popc

ты не ищешь критическую секцию?

person Thiago Conrado    schedule 02.09.2016