CUDA Thrust reduce_by_key с меньшим объемом памяти

Я пытаюсь уменьшить объем памяти, необходимый для вычисления reduce_by_key для моего варианта использования. У меня относительно небольшое количество уникальных ключей (около 100-150) по сравнению с количеством значений (около 16 миллионов). пример показывает, что device_vectors, выделенные для хранения результата, относятся к того же размера, что и входы. Всегда ли необходимо это делать? Можно ли выделить столько памяти, сколько необходимо для правильного вывода?


person aatish    schedule 26.08.2015    source источник
comment
Должна быть возможность ограничить размер ваших выходных векторов равным или большим, чем максимальное количество ключей. Ты это пробовал? Не забывайте, что последовательности клавиш должны быть смежными, как ключи. Например, следующая последовательность: 0 1 0 1 представляет четыре уникальных ключа. В общем случае, когда вы не знаете, сколько ключей присутствует, в худшем случае выходные векторы имеют тот же размер, что и входные векторы.   -  person Robert Crovella    schedule 26.08.2015


Ответы (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