Ваш пример, по сути, является специализированной сортирующей подсчет для входных данных с уникальными ключами (т.е. без дубликатов).Чтобы сделать код правильной подсчетной сортировкой, вы можете заменить присвоение outarr[inarr[idx]] = 1
на atomicAdd(inarr + idx, 1)
, чтобы подсчитать дублирующиеся ключи.Однако, несмотря на то, что атомарные операции довольно дороги, у вас все еще есть проблема, заключающаяся в том, что сложность метода пропорциональна наибольшему значению на входе.К счастью, radix sort решает обе эти проблемы.
Radix sort можно рассматривать как обобщение сортировки подсчета, которая рассматривает только B
битов ввода за раз.Так как целые числа B
битов могут принимать значения только в диапазоне [0,2^B)
, мы можем не смотреть на весь диапазон значений.
Теперь, прежде чем вы начнете выполнять сортировку по основанию в CUDA, я должен предупредить васчто он был широко изучен и чрезвычайно быстро реализации легко доступны.Фактически, библиотека Thrust автоматически применяет сортировку по радиусу, когда это возможно.