O Thrust tem o thrust::reduce_by_key
algoritmo que funciona bem para um problema meu. Eu queria tentar usar o CUB para um controle mais fino de memória e fluxos, bem como interação com meus próprios kernels, mas não parece haver um reduce_by_key
equivalente no CUB. Há, cub::DeviceSegmentedReduce
mas ele não parece gerar uma ordem de chave, e eu precisaria encontrar o início de cada segmento consecutivo de chaves de antemão, o que é seu próprio problema.
O problema é reduzir uma matriz de pares chave-valor em uma matriz onde todas as chaves são únicas e cada valor tem a redução de todos os mesmos valores de chave.
Existe uma maneira fácil de fazer isso com o CUB que não estou vendo?
Sim, o algoritmo que você está procurando é chamado
cub::DeviceReduce::ReduceByKey
. Por algum motivo* ele é categorizado como redução em vez de redução segmentada, o que certamente é confuso.*: Talvez
cub::DeviceSegmentedReduce
seja uma adição mais recente e eles não queriam quebrar a compatibilidade com versões anteriores saindoReduceByKey
doDeviceReduce
.