Determinar el elemento mínimo y su posición en cada columna de matriz con CUDA Thrust
Tengo un problema bastante simple, pero no puedo encontrar una solución elegante.
Tengo un código de empuje que producec
Vectores del mismo tamaño que contienen valores. Digamos cada uno de estosc
Los vectores tienen un índice. Me gustaría para cada posición del vector obtener el índice dec
Vector para el cual el valor es el más bajo:
Ejemplo:
C0 = (0,10,20,3,40)
C1 = (1,2 ,3 ,5,10)
Obtendría como resultado un vector que contiene el índice deC
vector que tiene el valor más bajo:
result = (0,1 ,1 ,0,1)
He pensado en hacerlo utilizando iteradores de zip de empuje, pero he encontrado varios problemas: podría comprimir todos losc
vectores e implementa una transformación arbitraria que toma una tupla y devuelve el índice de su valor más bajo, pero:
10
Elementos y no puede haber mucho más que10
c
vectoresEntonces pensé en hacerlo de esta manera: en lugar de tenerc
separar los vectores, añadirlos todos en un solo vectorC
, luego genere claves que hagan referencia a las posiciones y realice una clasificación estable por clave que reagrupará las entradas de vectores desde una misma posición. En el ejemplo que daría:
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 )
Luego genere claves con las posiciones en el vector, zip la salida con el índice de lac
vectores y luego realice una reducción por clave con un functor personalizado que para cada reducción genera el índice con el valor más bajo. En el ejemplo:
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)
Sin embargo, ¿cómo escribir dicho funtor para la operación de reducción por tecla?