2011-12-05 16 views
5

Sto usando CUDA/Thrust/CUDPP. Come ho capito, nella compattazione Stream, alcuni elementi in un array sono contrassegnati come non validi e quindi "rimossi".Compattamento CUDA Stream: comprensione del concetto

Ora che cosa significa "rimozione" significa veramente qui? Supponiamo che l'array originale A e ha lunghezza 6. Se 2 elementi sono validi (da qualunque condizione ci possono fornire) allora

  1. Il sistema crea una nuova array di dimensione 4 GPU memoria per memorizzare il elementi validi per ottenere il risultato finale?

  2. OPPURE rimuove fisicamente gli elementi non validi dalla memoria e riduce l'array originale A alla dimensione 4 mantenendo solo gli elementi validi?

In entrambi i casi, ciò non significa che l'allocazione dinamica della memoria sta avvenendo sotto il cofano? Ma avevo sentito dire che l'allocazione dinamica della memoria non è possibile nel mondo CUDA.

+2

C'è un'altra possibilità, ovvero che la dimensione dell'allocazione di memoria non cambia e che i primi 4 elementi sono validi, gli ultimi 2 non sono definiti. Ma in realtà questa domanda riguarda tutti i problemi di implementazione e chi può dire che CUDPP o spinta funzionano allo stesso modo? – talonmies

+0

ArrayFire è un'opzione migliore/più semplice di Thrust e anche gratuita, almeno per l'utilizzo della singola GPU. http://accelereyes.com/arrayfire – arrayfire

risposta

4

Innanzitutto, l'allocazione dinamica della memoria è possibile in CUDA su dispositivi con capacità di calcolo 2.0 e superiori. La libreria di runtime CUDA supporta malloc/free e new/delete nelle funzioni __device__. Ma non è pertinente alla risposta, davvero.

In genere viene fornito un array di uscita sufficientemente grande (pre-allocato, spesso della stessa dimensione dell'array di input) e l'output viene scritto su di esso. Non è richiesta alcuna allocazione dinamica, ma esiste potenzialmente un rifiuto di archiviazione. Questo è ciò che CUDPP e spinta fanno. Un'alternativa sarebbe quella di eseguire prima un conteggio di elementi validi, quindi allocare la memoria GPU in uscita in modo dinamico usando cudaMalloc chiamato dalla CPU host.

+1

Questo non è ciò che fa Thrust :) Gli algoritmi di compattazione in Thrust (ad es. '' 'thrust :: copy_if''') in genere richiedono un buffer di output. –

+0

Grazie. Modificato la mia risposta. Cosa succede se l'iteratore del risultato indica un'allocazione non sufficientemente grande? C'è un dimensionamento automatico? – harrism

+0

No; se l'iteratore punta a un buffer insufficiente, il comportamento non è definito (vale a dire, si blocca). –