Определение наименьшего элемента и его положения в каждом столбце матрицы с помощью CUDA Thrust

У меня довольно простая проблема, но я не могу найти элегантного решения.

У меня есть код Thrust, который выдаетc векторы одинакового размера, содержащие значения. Скажем, каждый из этихc векторы имеют индекс. Я хотел бы для каждой позиции вектора, чтобы получить индексc вектор, для которого значение является наименьшим:

Пример:

C0 =     (0,10,20,3,40)
C1 =     (1,2 ,3 ,5,10)

Я бы получил в результате вектор, содержащий индексC вектор, который имеет наименьшее значение:

result = (0,1 ,1 ,0,1)

Я думал о том, чтобы сделать это с помощью итераторов Thrust Zip, но столкнулся с проблемами: я мог бы сжать всеc векторы и реализуют произвольное преобразование, которое принимает кортеж и возвращает индекс его наименьшего значения, но:

Как перебрать содержимое кортежа?Как я понимаю, кортежи могут хранить только до10 элементы и там может быть гораздо больше, чем10 c векторы.

Затем я подумал сделать это так: вместо того, чтобы иметьc отдельные векторы, добавьте их все в один векторC, затем сгенерируйте ключи, ссылающиеся на позиции, и выполните устойчивую сортировку по ключу, которая объединит векторные записи из одной позиции вместе. В примере, который дал бы:

C =      (0,10,20,3,40,1,2,3,5,10)
keys =   (0,1 ,2 ,3,4 ,0,1,2,3,4 )
after stable sort by key:
output = (0,1,10,2,20,3,3,5,40,10)
keys =   (0,0,1 ,1,2 ,2,3,3,4 ,4 )

Затем сгенерируйте ключи с позициями в векторе, заархивируйте выходные данные с индексомc векторов, а затем выполнить уменьшение по ключу с помощью специального функтора, который для каждого сокращения выводит индекс с наименьшим значением. В примере:

input =  (0,1,10,2,20,3,3,5,40,10)
indexes= (0,1,0 ,1,0 ,1,0,1,0 ,1)
keys =   (0,0,1 ,1,2 ,2,3,3,4 ,4)
after reduce by keys on zipped input and indexes:
output = (0,1,1,0,1)

Однако как написать такой функтор для операции сокращения по ключу?

Ответы на вопрос(3)

Ваш ответ на вопрос