Как получить смещение от тяги device_ptr в CUDA? - PullRequest
0 голосов
/ 03 мая 2020

Рассмотрим следующий код:

thrust::device_ptr<uint> dev_ptr_keys(ptrCellIDs);

thrust::device_ptr<uint> dev_ptr_offset(ptrOffset);
thrust::pair<thrust::discard_iterator<>, thrust::device_ptr<uint>> end;

end = thrust::reduce_by_key(dev_ptr_keys, dev_ptr_keys + 10,
    thrust::make_constant_iterator(1), 
    thrust::make_discard_iterator(), 
    dev_ptr_offset, binary_pred, binary_op);

Функция reduce_by_key в этом случае должна создать массив смещений равных значений в массиве, на который указывает указатель устройства dev_ptr_keys, и сохранить его в массив на dev_ptr_offset. Поэтому:

Intput (dev_ptr_keys): { 1, 4, 4, 4, 2, 2, 1 }

Выход (dev_ptr_offset): { 1, 3, 2, 1 }

Пока все хорошо, однако мне также нужно знать размер нового действительного массива вывода, который должен быть сохранен в end.second. Но мне не удается получить эту информацию. Я пытался играть с thrust::raw_pointer_cast(), но мне не удается получить значение ни в пределах моего ядра (путем доступа указателя обернутого указателя устройства тяги), ни в моем коде хоста.

Как я могу получить информацию о размере моего вывода в этом конкретном случае?

1 Ответ

1 голос
/ 03 мая 2020

Ну, из всего, что я попробовал, следующее было последним, и оно работает так, как я хочу:

uint numOffset = thrust::raw_pointer_cast(&end.second[0]) - thrust::raw_pointer_cast(&dev_ptr_offset[0]);

Остается вопрос: действительно ли это эффективно или вообще имеет значение?

...