Per la mia applicazione devo gestire un sacco di oggetti (diciamo int
s) che vengono successivamente divisi e ordinati in contenitori più piccoli. A tal fine, posso conservare gli elementi in un singolo schiera continuaRiduzioni parziali efficaci con matrici di elementi, offset e lunghezze di sottoliste
arr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14...}
e le informazioni relative alle benne (sottoliste) è dato dalla offset al primo elemento nella rispettiva secchio e le lunghezze della sottolista.
Così, per esempio, dato
offsets = {0,3,8,..}
sublist_lengths = {3,5,2,...}
comporterebbe seguenti cavalli:
0 1 2 || 3 4 5 6 7 || 8 9 || ...
Quello che sto cercando è un modo un po 'generale ed efficiente per eseguire algoritmi, come riduzioni, sui bucket solo utilizzando i kernel personalizzati o la libreria thrust
. Sommando i secchi dovrebbe dare:
3 || 25 || 17 || ...
Quello che è venuta in mente:
opzione 1: kernel personalizzati richiedono un bel po 'di ritocchi, le copie in memoria condivisa, scelta corretta di dimensioni di blocchi e griglie e una propria implementazione degli algoritmi, come scansione, riduzione, ecc. Inoltre, ogni singola operazione richiederebbe un proprio kernel personalizzato. In generale è chiaro a me come fare questo, ma dopo aver utilizzato
thrust
per l'ultimo paio di giorni ho l'impressione che ci potrebbe essere un modo più intelligenteopzione 2: generare una serie di chiavi dalla l'offset (
{0,0,0,1,1,1,1,1,2,2,3,...}
nell'esempio precedente) e utilizzarethrust::reduce_by_key
. Non mi piace la generazione di elenchi in più, però.opzione 3: Usa
thrust::transform_iterator
insiemethrust::counting_iterator
per generare il sopra data lista chiave al volo. Sfortunatamente, non riesco a trovare un'implementazione che non richieda incrementi di indici alla lista di offset sul dispositivo e sconfigge il parallelismo.
Quale sarebbe il modo più corretto per implementarlo?
La somiglianza con le matrici di righe sparse compresse ha colpito anche me. – talonmies