У меня есть два вектора int для ключей и значений, их размер около 500K.Использовать тягу, чтобы найти элемент в группах
Ключевые слова уже отсортированы. И примерно 10 тыс. Групп.
Значение неотрицательное (означает полезное) или -2 (означает не использовать), в каждой группе должно быть одно или нулевое неотрицательные значения, а остальное - -2.
key: 0 0 0 0 1 2 2 3 3 3 3
value:-2 -2 1 -2 3 -2 -2 -2 -2 -2 0
Третья пара группы 0 [0 1]
полезно. Для группы 1 мы получаем пару [1 3]
. Значения группы 2 равны -2, поэтому мы ничего не получаем. А для группы 3 результат [3 0]
.
Итак, вопрос в том, как я могу сделать это с помощью тяги или куды?
Вот две идеи.
Первый: Получите количество каждой группы по алгоритму гистограммы. Таким образом, барьер каждой группы может быть вычислен. Управлять thrust::find_if
на каждой группе, чтобы получить полезный элемент.
Второй один: Использование thrust::transform
добавить 2 для каждого значения и теперь все значения неотрицательны, а ноль означает бесполезно. Используйте thrust::reduce_by_key
, чтобы получить сокращение для каждой группы, а затем вычтите 2 для каждого выходного значения.
Я думаю, что должны быть какие-то другие методы, которые достигнут гораздо большей производительности, чем предыдущие два.
Производительность методов:
У меня есть тест Второй выше метод и метод дает @Robert Crovella, то есть. reduce_by_key и remove_if метод. Размер векторов 2691028, векторы состоят из 100001 групп. Вот их среднее время:
reduce_by_key: 1204ms
remove_if: 192ms
Сверху результата мы видим, что метод remove_if выполняется намного быстрее. А также метод «remove_if» прост в реализации и потребляет гораздо меньше памяти gpu.
Вкратце, метод @Robert Crovella очень хорош.
Спасибо за вашу помощь. Я ошибся в данных примера, и теперь я пересмотрел его. Я буду тестировать этот метод и позже поместить код и оценку их производительности. –