2010-07-15 7 views
7

La matrice per ordinare ha circa un milione di stringhe, in cui ogni stringa può avere una lunghezza massima di un milione di caratteri.Esiste un algoritmo per ordinare l'array di stringhe per la GPU?

Sto cercando qualsiasi implementazione dell'algoritmo di ordinamento per GPU.

Ho un blocco di dati con dimensioni di circa 1 MB e ho bisogno di costruire suffix array. Ora puoi vedere come è possibile avere un milione di stringhe all'interno di una quantità veramente piccola di memoria.

+0

'1M' caratteri per string (avg '.5M'?), stringhe' 1M', 2 byte/char (più comuni) produce: '.5 * 1 * 2 = 1TB' di memoria. Hai bisogno di qualcosa di speciale per questo (forse un database?), Poiché esistono pochissime macchine con quel tipo di memoria, per non parlare della memoria della GPU. http://blogs.technet.com/b/markrussinovich/archive/2008/07/21/3092070.aspx – Abel

+1

La lunghezza massima della stringa non dice nulla sulla media. Presumo che le stringhe siano già in memoria e ordinate, ma il poster non è soddisfatto delle prestazioni della CPU sull'attività. –

+0

Potrebbe essere rilevante/utile sentire come sono strutturati i dati. È un mucchio di stringhe contigue separate da '\ 0'? Le stringhe sono precedute da un'intestazione che contiene un conteggio dei byte? O c'è una serie di puntatori in un mucchio? Stiamo parlando di stringhe ASCII o Unicode? –

risposta

3

Lo stato dell'arte nell'ordinamento GPU non è particolarmente incoraggiante.

Per classificare 32 bit interi seguente carta dal 2009 (con 2 autori che sono ricercatori Nvidia) sostiene solo aumento del 23% per la migliore CUDA ordinamento su GTX280 rispetto ai migliori ordinamento CPU su un nucleo 4 Yorkfield.

http://www.mgarland.org/files/papers/gpusort-ipdps09.pdf

Questo usato un ordinamento di radice sulla GPU e unire ordinamento CPU. Avresti bisogno di un ordinamento basato su confronto per costruire un suffisso array, quindi al posto di GPX radix sort il meglio di quelli nella carta sarebbe l'ordinamento di merge GPU, che ha ottenuto circa la metà della velocità di GPX radix sort (con 1 milione chiavi) - cioè circa il 40% più lento rispetto all'ordinamento di fusione della CPU.

L'aggiunta di chiavi di lunghezza variabile sembra probabile che i thread in una curvatura non saranno sincronizzati su una GPU, quindi ridurrebbe le prestazioni sulla GPU più della CPU.

In generale se il tuo scopo è quello di costruire un sistema efficiente, ti consiglio di utilizzare un'implementazione della CPU per questo problema perché sarà più veloce e più facile da scrivere.

Ma, se il vostro scopo è quello di sperimentare o semplicemente per conoscere GPU, allora si può trovare l'attuazione CUDA di merge sort dalla carta nel CUDA SDK:

http://developer.download.nvidia.com/compute/cuda/sdk/website/Data-Parallel_Algorithms.html

+1

L'intero punto di CUDA non è l'utilizzo di un processore inattivo? Anche se non si ottiene alcun miglioramento della velocità su una GPU rispetto a una CPU, si otterrebbe comunque un miglioramento 2X rispetto alla sola CPU, purché si possa utilizzare in modo efficace il parallelismo extra. –

+0

@Robert Harvey - la maggior parte degli usi di CUDA non mantiene la CPU occupata allo stesso tempo. Tuttavia recentemente questo è diventato più comune e viene solitamente chiamato GPU/CPU ibrido. La necessità di copiare tra le memorie CPU e GPU tende a rendere abbastanza difficile ottenere buone prestazioni. In questo caso, mi aspetterei che al massimo si raggiungesse il 150% della velocità della CPU, e sarebbe meglio investire in un sistema con due CPU. – RD1

+0

Grazie per la risposta. Sono d'accordo con tutte le tue note sull'ordinamento delle stringhe su una GPU, ho pensato allo stesso modo, ma avevo sperato che esistesse un algoritmo che mi era sfuggito. – Kentzo

Problemi correlati