2012-09-17 20 views
7

Come rimuovere in modo efficiente i valori zero da una matrice in parallelo utilizzando CUDA. Le informazioni sul numero di valori zero sono disponibili in anticipo, che dovrebbe semplificare questa operazione.Come rimuovere valori zero da una matrice in parallelo

È importante che i numeri rimangano ordinati come nell'array sorgente, durante la copia nell'array risultante.


Esempio:

sull'array, ad esempio contenere i seguenti valori: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] con le informazioni aggiuntive che 5 valori sono zeri. Il risultato finale desiderato sarebbe allora altro array contenente: [19, 7, 3, 5, 1] ​​

+0

sicuramente si desidera rimuovere gli zeri ? se togli i non zeri otterresti un array di soli zero ?! –

+0

sì corretto. Sto cercando un modo efficace per rimuovere i valori zero dalla matrice di origine. –

+0

Vorrei sostituire il ciclo for attraverso i fili cuda, effettuando parallelamente la rimozione. –

risposta

7

Per eliminare alcuni elementi di una matrice è possibile utilizzare Thrust Library's compaction operations. Dato un predicato is_not_zero, che restituisce false per valori zero, e true per gli altri, è possibile scrivere l'operazione simili

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero); 

matrice di output includerà solo i valori che sono non-zero, perché il predicato indica così .

Si può anche utilizzare la funzione "remove_if" con un predicato inversa che restituiscono true per zeri, e false per gli altri ..

thrust::remove_if(in_array, in_array + size, is_zero); 

vi consiglio di dare un'occhiata a esempi di compattazione della biblioteca di spinta, o generale concetto di compattazione.

http://code.google.com/p/thrust/source/browse/examples/stream_compaction.cu

+0

Potrei non essere in grado di usare la spinta in quel progetto, ma se potessi, userò la tua proposta. Grazie per il tuo aiuto. –

+2

Ci sono librerie simili e solo implementazioni del kernel per la compattazione. Potresti non aver bisogno di usare Thrust solo per questa funzione, ti suggerisco di usarlo comunque. Guarda gli esempi di CUDA SDK. – phoad

0

Che dire di una variante del merging odd-even ordinamento, o di fatto qualsiasi algoritmo di ordinamento, in cui l'ordinamento è definita da a < b === (a != 0 && b == 0)?

+1

Questo è un ordinamento a un bit, quindi si può fare molto meglio di un ordinamento di fusione generale. –

+0

@JaredHoberock: Beh, non ti ho visto proporre un approccio di lavoro diverso che funzioni molto meglio. – wilx

+0

Un altro problema con un approccio di ordinamento è che distruggerebbe l'input, che @ diver_182 desidera conservare nell'array di input.'remove_copy_if' funzionerà meglio per questo caso come note @phoad sopra. –

Problemi correlati