Для моего приложения мне приходится обрабатывать кучу объектов (скажем, int
), которые впоследствии делятся и сортируются по более мелким ведрам. С этой целью, хранить элементы в виде одного непрерывного массиваЭффективные частичные сокращения заданных массивов элементов, смещения и длины подписок
arr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14...}
и информация о ведрах (подсписках) задаются смещениями к первому элементу в соответствующем ведре и длинами подсписка.
Так, например, при
offsets = {0,3,8,..}
sublist_lengths = {3,5,2,...}
приведет к следующим расколам:
0 1 2 || 3 4 5 6 7 || 8 9 || ...
То, что я ищу, это несколько общего и эффективный способ запуска алгоритмов, такие как сокращение, на ведрах, используя только пользовательские ядра или библиотеку thrust
. Суммируя ведра должны давать:
3 || 25 || 17 || ...
То, что я придумал:
вариант 1: пользовательские ядра требуют совсем немного мастерить, копии в общую память, правильный выбор размеров блоков и сеток и собственной реализации алгоритмов, таких как сканирование, уменьшение и т. д. Кроме того, для каждой отдельной операции потребуется собственное настраиваемое ядро. В общем, для меня ясно, как это сделать, но после использования
thrust
за последние пару дней у меня создалось впечатление, что там может быть более разумный способвариант 2: генерировать массив ключей от смещения (
{0,0,0,1,1,1,1,1,2,2,3,...}
в приведенном выше примере) и используйтеthrust::reduce_by_key
. Тем не менее, мне не нравится создание дополнительных списков.вариант 3: Используйте
thrust::transform_iterator
вместе сthrust::counting_iterator
для генерации выше заданного списка ключей на лету. К сожалению, я не могу придумать реализацию, которая не требует приращений индексов в списке смещений на устройстве и проигрывает параллелизм.
Что было бы самым разумным способом реализовать это?
Сходство с сжатыми разреженными матрицами строк поразило меня тоже. – talonmies