Quale algoritmo di ordinamento parallelo ha le migliori prestazioni nel caso medio?


134

L'ordinamento richiede O (n log n) nel caso seriale. Se avessimo processori O (n) spereremmo per un aumento di velocità lineare. Esistono algoritmi paralleli O (log n) ma hanno una costante molto alta. Inoltre, non sono applicabili all'hardware delle materie prime che non ha processori O (n) vicini. Con i processori p, gli algoritmi ragionevoli dovrebbero richiedere tempo O (n / p log n).

Nel caso seriale, l'ordinamento rapido ha la migliore complessità di runtime in media. Un algoritmo di ordinamento rapido parallelo è facile da implementare (vedi qui e qui ). Tuttavia, non funziona bene poiché il primo passo è quello di partizionare l'intera raccolta su un singolo core. Ho trovato informazioni su molti algoritmi di ordinamento in parallelo, ma finora non ho visto nulla che punta a un chiaro vincitore.

Sto cercando di ordinare elenchi da 1 a 100 milioni di elementi in un linguaggio JVM in esecuzione da 8 a 32 core.


@Jon Anything davvero. Saranno oggetti del mio dominio che sono tutti diversi, ma tutti implementano Comparable.
Craig P. Motlin,

1
Penso che tu abbia troppi n / p nel tuo "dovrebbe prendere"
Sparr il

@Sparr Non la penso così. Sto facendo una distinzione tra avere pochi processori e avere tanti processori quanti elementi vengono ordinati.
Craig P. Motlin,

@ CraigP.Motlin giusto, ma sembra che tu abbia "distribuito" erroneamente / p. Dovrebbe esserci solo uno / p.
Sparr,

@Sparr Ah, l'ho cambiato, grazie.
Craig P. Motlin,

Risposte:


206

Il seguente articolo (download PDF) è uno studio comparativo di algoritmi di ordinamento parallelo su varie architetture:

Algoritmi di ordinamento parallelo su varie architetture

Secondo l'articolo, l' ordinamento di esempio sembra essere il migliore su molti tipi di architettura parallela.

Aggiornamento per rispondere alle preoccupazioni sull'età di Mark:

Ecco articoli più recenti che introducono qualcosa di più nuovo (dal 2007, che, tra l'altro, viene ancora confrontato con l'ordinamento del campione):

Miglioramenti sull'ordinamento di esempio
AA-Sort

The bleeding edge (circa 2010, alcuni solo un paio di mesi):

Schema di ordinamento parallelo Ordinamento
parallelo basato su GPU multi-core Ordinamento parallelo
ibrido CPU / GPU
Algoritmo di ordinamento parallelo randomizzato con uno studio sperimentale Ordinamento parallelo
altamente scalabile
Ordinamento Ordinamento di N-Elements usando l'ordine naturale: un nuovo approccio di ordinamento adattivo

Aggiornamento per il 2013: ecco il limite massimo di gennaio 2013. (Nota: alcuni dei collegamenti sono ai documenti di Citeseer e richiedono la registrazione gratuita):

Lezioni universitarie:
partizionamento parallelo per la selezione e l'ordinamento
Algoritmi di ordinamento parallelo Conferenza Un metodo OpenCL di algoritmi di ordinamento parallelo per architettura GPU Ordinamento dei dati mediante unità di elaborazione grafica
parallelo algoritmi di ordinamento Lecture 2
Paralleli algoritmi di ordinamento delle lezioni 3

Altre fonti e documenti:
Un romanzo algoritmo di ordinamento per le architetture many-core basata su adattativo sorta bitonico
parallelo altamente scalabile Ordinamento 2
Parallel Merging
Parallel Unione di 2
sistemi di ordinamento parallelo paralleli per oggetti
Confronto delle prestazioni di algoritmi di ordinamento rapido sequenziale e di ordinamento rapido parallelo
Memoria condivisa, passaggio di messaggi e tipi di unione ibrida per SMP standalone e cluster
Vari algoritmi paralleli (sorting et al) tra cui implementazioni

Fonti e documenti ibridi GPU e CPU / GPU: Algoritmi efficienti per l'ordinamento su GPU Progettazione di algoritmi di ordinamento efficienti per molte GPU Ordinamento deterministico dei campioni per GPU Ordinamento rapido sul posto con CUDA basato su ordinamento bitonico Ordinamento rapido di GPU parallele mediante un algoritmo ibrido Algoritmi di ordinamento parallelo veloce su GPU Ordinamento rapido su CPU e GPU: un caso per l'oblio della larghezza di banda Ordinamento di campioni SIMD ordinamento GPU GPU-ABiSort: Ordinamento parallelo ottimale su architetture di streaming GPUTeraSort: alto ordinamento di coprocessore grafico delle prestazioni per la gestione di grandi database












Algoritmo di ordinamento basato su confronto ad alte prestazioni su GPU a più core
Parallelo ordinamento esterno per GPU abilitate CUDA con bilanciamento del carico e bassi costi di trasferimento
Ordinamento su GPU per set di dati su larga scala: un confronto approfondito


2
È uno studio comparativo di algoritmi di ordinamento parallelo su varie architetture attuali nel 1996. Da allora sono cambiate molte cose nel calcolo parallelo.
High Performance Mark

1
Sembra che tu abbia perso qual è l'IMHO il migliore di tutti, l'implementazione efficiente dell'ordinamento nell'architettura SIMD multi-core. Dalla ricerca Intel, presentata al VLDB 2008.
alecco,

1
Questa sarebbe stata un'ottima risposta, una volta. Ora, la maggior parte dei collegamenti sono interrotti.
Tim Long,

6

Ho lavorato sia con un algoritmo Parallel Quicksort sia con un algoritmo PSRS che fondamentalmente combina quicksort in parallelo con l'unione.

Con l'algoritmo Parallel Quicksort, ho dimostrato uno speedup quasi lineare con un massimo di 4 core (dual core con hyper-threading), che è previsto alla luce dei limiti dell'algoritmo. Un Quicksort parallelo puro si basa su una risorsa stack condivisa che si tradurrà in una contesa tra i thread, riducendo così qualsiasi guadagno in termini di prestazioni. Il vantaggio di questo algoritmo è che ordina "sul posto", il che riduce la quantità di memoria necessaria. Potresti prendere in considerazione ciò quando ordini verso l'alto di 100 milioni di elementi come hai dichiarato.

Vedo che stai cercando di ordinare su un sistema con 8-32 core. L'algoritmo PSRS evita la contesa sulla risorsa condivisa, consentendo una maggiore velocità a un numero maggiore di processi. Ho dimostrato l'algoritmo con un massimo di 4 core come sopra, ma i risultati sperimentali di altri riportano una velocità quasi lineare con un numero molto maggiore di core, 32 e oltre. Lo svantaggio dell'algoritmo PSRS è che non è presente e richiederà molta più memoria.

Se sei interessato, puoi utilizzare o esaminare il mio codice Java per ciascuno di questi algoritmi. Puoi trovarlo su github: https://github.com/broadbear/sort . Il codice è inteso come una sostituzione drop-in di Java Collections.sort (). Se stai cercando la possibilità di eseguire l'ordinamento parallelo in una JVM come indicato sopra, il codice nel mio repository potrebbe aiutarti. L'API è completamente generica per gli elementi che implementano Comparable o implementano il proprio Comparator.

Posso chiederti per cosa stai cercando di ordinare così tanti elementi? Sono interessato a conoscere potenziali applicazioni per il mio pacchetto di smistamento.


Ho un processore a 8 core. :) Ora ho testato l'ordinamento verso l'alto di 40 milioni di elementi. Non vedo un aumento di velocità lineare, ma vedo un sostanziale aumento delle prestazioni rispetto all'algoritmo di ordinamento Java 8 Collections standard, che si presume sia un Timsort multi-thread. La mia implementazione PSRS ordina 40 milioni di elementi in una media di 4985 ms, rispetto ai 19759 ms dell'algoritmo di ordinamento JDK predefinito.
Broadbear


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.