Określenie najmniejszego elementu i jego położenia w każdej kolumnie macierzy za pomocą ciągu CUDA
Mam dość prosty problem, ale nie mogę znaleźć eleganckiego rozwiązania.
Mam kod Thrust, który wytwarzac
wektory o tym samym rozmiarze zawierające wartości. Powiedzmy, że każdy z nichc
wektory mają indeks. Chciałbym dla każdej pozycji wektorowej uzyskać indeksc
wektor, dla którego wartość jest najniższa:
Przykład:
C0 = (0,10,20,3,40)
C1 = (1,2 ,3 ,5,10)
Otrzymałbym w wyniku wektor zawierający indeksC
wektor o najniższej wartości:
result = (0,1 ,1 ,0,1)
Pomyślałem o zrobieniu tego za pomocą iteratorów pchnięcia z pchnięciem, ale natknąłem się na problemy: mogłem rozpakować wszystkiec
wektory i implementuj dowolną transformację, która przyjmuje krotkę i zwraca indeks swojej najniższej wartości, ale:
10
elementy i może być ich znacznie więcej10
c
wektory.Pomyślałem wtedy o zrobieniu tego w ten sposób: zamiast miećc
oddzielne wektory, dołącz je wszystkie w jednym wektorzeC
, następnie wygeneruj klucze odwołujące się do pozycji i wykonaj stabilny klucz sortowania, który spowoduje przegrupowanie pozycji wektora z tej samej pozycji razem. W przykładzie, który dałby:
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 )
Następnie wygeneruj klucze z pozycjami w wektorze, zapisz dane wyjściowe indeksemc
wektory, a następnie wykonaj klucz zmniejszania za pomocą niestandardowego funktora, który dla każdej redukcji generuje indeks o najniższej wartości. W przykładzie:
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)
Jak jednak napisać taki funktor dla operacji zmniejszania za pomocą klucza?