Я пытаюсь уменьшить объем памяти, необходимый для вычисления reduce_by_key для моего варианта использования. У меня относительно небольшое количество уникальных ключей (около 100-150) по сравнению с количеством значений (около 16 миллионов). пример показывает, что device_vectors, выделенные для хранения результата, относятся к того же размера, что и входы. Всегда ли необходимо это делать? Можно ли выделить столько памяти, сколько необходимо для правильного вывода?
CUDA Thrust reduce_by_key с меньшим объемом памяти
Ответы (1)
Выходной размер редукции зависит от входных данных, и это значение обычно неизвестно до редукции. Однако, в зависимости от вашей проблемы, иногда вы знаете этот размер.
В разумных реализациях для вывода потребуется не менее количества ключевых диапазонов. И thrust::reduce_by_key
кажется, включен в этот список.
Примеры:
Несортированный (общий случай)
Размер вывода трудно предсказать
keys 2 2 2 3 3 2 1
values 1 1 1 1 1 1 1
|----------|------|----|---|
4 spans
reduced 3 2 1 1
Отсортировано (в лучшем случае)
Размер вывода равен количеству уникальных ключей
keys 1 2 2 2 2 3 3
values 1 1 1 1 1 1 1
|--|---------------|------|
3 spans
reduced 1 4 2
Чередование, соседние ключи не повторяются (худший случай)
Выходной размер равен входному размеру
keys 1 2 3 1 2 3 1
values 1 1 1 1 1 1 1
|--|---|---|---|---|---|--|
7 spans
reduced 1 1 1 1 1 1 1
Другое дело, что если вам не нужны ключи для вывода, вы можете отбросить их с помощью thrust::discard_iterator
и сэкономить дополнительное место, как описано здесь.
person
Ivan Aksamentov - Drop
schedule
26.08.2015
0 1 0 1
представляет четыре уникальных ключа. В общем случае, когда вы не знаете, сколько ключей присутствует, в худшем случае выходные векторы имеют тот же размер, что и входные векторы. - person Robert Crovella   schedule 26.08.2015