Algoritma pemilahan paralel manakah yang memiliki kinerja kasus rata-rata terbaik?

134

Penyortiran mengambil O (n log n) dalam case serial. Jika kita memiliki prosesor O (n), kita akan berharap untuk peningkatan linear. O (log n) algoritma paralel ada tetapi mereka memiliki konstanta yang sangat tinggi. Mereka juga tidak berlaku pada perangkat keras komoditas yang tidak memiliki prosesor O (n). Dengan prosesor p, algoritma yang masuk akal seharusnya membutuhkan waktu O (n / p log n).

Dalam kasus serial, pengurutan cepat memiliki kompleksitas runtime terbaik rata-rata. Algoritma pengurutan cepat paralel mudah diterapkan (lihat di sini dan di sini ). Namun itu tidak berfungsi dengan baik karena langkah pertama adalah mempartisi seluruh koleksi pada satu inti. Saya telah menemukan informasi tentang banyak algoritma pengurutan paralel tetapi sejauh ini saya belum melihat apa pun yang menunjuk pada pemenang yang jelas.

Saya mencari untuk mengurutkan daftar 1 juta hingga 100 juta elemen dalam bahasa JVM yang berjalan pada 8 hingga 32 core.

Craig P. Motlin
sumber
@ Jon Apa pun benar-benar. Mereka akan menjadi objek domain saya yang semuanya berbeda, tetapi semuanya mengimplementasikan Sebanding.
Craig P. Motlin
1
Saya pikir Anda memiliki satu terlalu banyak n / p di "harus mengambil"
Sparr
@Parr Saya tidak berpikir begitu. Saya membuat perbedaan antara memiliki beberapa prosesor dan memiliki prosesor sebanyak elemen yang diurutkan.
Craig P. Motlin
@ CraigP.Motlin benar, tetapi Anda tampaknya telah "mendistribusikan" / p keliru. Seharusnya hanya ada satu / p.
Sparr
@Parr Ah, ubah itu, terima kasih.
Craig P. Motlin

Jawaban:

206

Artikel berikut (unduhan PDF) adalah studi perbandingan algoritma penyortiran paralel pada berbagai arsitektur:

Algoritma pemilahan paralel pada berbagai arsitektur

Menurut artikel itu, jenis sampel tampaknya paling baik pada banyak jenis arsitektur paralel.

Pembaruan untuk mengatasi masalah usia Mark:

Berikut adalah artikel yang lebih baru memperkenalkan sesuatu yang lebih baru (dari 2007, yang, masih dibandingkan dengan jenis sampel):

Perbaikan pada jenis sampel
AA-Sort

Ujung pendarahan (sekitar 2010, beberapa hanya beberapa bulan):

Pola pemilahan
paralel Pemilahan paralel berbasis banyak inti GPU
Hybrid CPU / GPU parallel sorting
Algoritma Pengurutan Paralel Acak dengan Studi Eksperimental
pemilahan paralel yang sangat skalabel
Menyortir N-Elements Menggunakan Natural Order: Pendekatan Penyortiran Adaptif Baru

Pembaruan untuk 2013: Berikut adalah tepi yang berdarah sekitar Januari, 2013 (Catatan: Beberapa tautan ditujukan ke surat kabar di Citeseer dan memerlukan pendaftaran yang gratis):

Perkuliahan Universitas:
Partisi Paralel untuk Seleksi dan Pemilahan
Algoritma Pemilahan Paralel Kuliah Algoritma Pemilahan
Paralel Kuliah 2
Algoritma Pemilahan Paralel Kuliah 3

Sumber dan makalah lain:
Algoritma pemilahan novel untuk arsitektur banyak-inti berdasarkan jenis bitonic adaptif
Penyortiran Paralel yang Dapat Disejajarkan 2
Paralel Paralel yang Menggabungkan
Paralel Menggabungkan 2
Sistem Self-Sorting Paralel untuk
Kinerja Objek Perbandingan Urutan Quick Sort dan Algoritma Quick Sort Paralel
Memori Bersama, Lewat Pesan, dan Urutan Penggabungan Hibrid untuk SMP Mandiri dan Berkelompok
Berbagai algoritma paralel (pengurutan et al) termasuk implementasi

GPU dan CPU / GPU sumber hibrida dan kertas:
Sebuah Cara OpenCL dari Paralel Sorting Algoritma untuk GPU Arsitektur
data Sorting Menggunakan Graphics Processing Unit
Efisien Algoritma untuk Sorting pada GPU
Merancang algoritma sorting yang efisien untuk manycore GPU
deterministik Contoh Urutkan Untuk GPU
Cepat di tempat penyortiran dengan CUDA berdasarkan jenis bitonik Penyortiran
GPU paralel cepat menggunakan algoritma hybrid Algoritma
Penyortiran Paralel Cepat pada GPU Penyortiran
cepat pada CPU dan GPU: kasus untuk bandwidth yang tidak disadari SIMD sortir jenis
sampel
GPU GPU-ABiSort: Penyortiran Paralel Optimal pada Arsitektur Stream
GPUTeraSort: tinggi grafik kinerja prosesor sorting untuk manajemen database besar
Algoritma pemilahan berbasis perbandingan yang berkinerja tinggi pada GPU banyak-inti
Pengurutan eksternal paralel untuk GPU yang mendukung CUDA dengan penyeimbangan beban dan overhead transfer rendah
Menyortir pada GPU untuk kumpulan data skala besar: Perbandingan menyeluruh

Michael Goldshteyn
sumber
2
Ini adalah studi perbandingan algoritma sorting paralel pada berbagai arsitektur saat ini pada tahun 1996. Banyak yang telah berubah dalam komputasi paralel sejak saat itu.
High Performance Mark
1
Tampaknya Anda melewatkan apa yang IMHO yang terbaik dari semua, Implementasi Efisien Penyortiran dalam arsitektur SIMD Multi-core. Dari riset Intel, dipresentasikan di VLDB 2008.
alecco
1
Ini akan menjadi jawaban yang bagus, sekali. Sekarang, sebagian besar tautan terputus.
Tim Long
6

Saya telah bekerja dengan algoritma Quicksort Paralel dan algoritma PSRS yang pada dasarnya menggabungkan quicksort secara paralel dengan penggabungan.

Dengan algoritma Quicksort Paralel, saya telah mendemonstrasikan speedup dekat linear dengan hingga 4 core (dual core dengan hyper-threading), yang diharapkan mengingat keterbatasan algoritma. Quicksort Paralel murni bergantung pada sumber daya tumpukan bersama yang akan menghasilkan pertentangan di antara utas, sehingga mengurangi setiap perolehan kinerja. Keuntungan dari algoritma ini adalah bahwa ia mengurutkan 'di tempat,' yang mengurangi jumlah memori yang dibutuhkan. Anda mungkin ingin mempertimbangkan ini ketika menyortir elemen 100M ke atas seperti yang Anda nyatakan.

Saya melihat Anda mencari untuk mengurutkan pada sistem dengan 8-32 core. Algoritma PSRS menghindari pertengkaran di sumber daya bersama, memungkinkan percepatan pada jumlah proses yang lebih tinggi. Saya telah mendemonstrasikan algoritme dengan hingga 4 core seperti di atas, tetapi hasil eksperimen orang lain melaporkan mendekati linear speedup dengan jumlah core yang jauh lebih besar, 32 dan lebih banyak. Kerugian dari algoritma PSRS adalah bahwa ia tidak di tempat dan akan membutuhkan lebih banyak memori.

Jika Anda tertarik, Anda dapat menggunakan atau membaca dengan teliti kode Java saya untuk masing-masing algoritma ini. Anda dapat menemukannya di github: https://github.com/broadbear/sort . Kode ini dimaksudkan sebagai pengganti Java Collections.sort (). Jika Anda mencari kemampuan untuk melakukan pengurutan paralel dalam JVM seperti yang Anda sebutkan di atas, kode di repo saya dapat membantu Anda. API sepenuhnya digeneralisasi untuk elemen yang mengimplementasikan Sebanding atau mengimplementasikan Pembanding Anda sendiri.

Bolehkah saya bertanya apa yang Anda cari untuk menyortir banyak elemen? Saya tertarik untuk mengetahui aplikasi potensial untuk paket sortir saya.

broadbear
sumber
Saya mendapat prosesor 8 inti. :) Sekarang saya telah menguji penyortiran elemen 40M ke atas. Saya tidak melihat speedup linier, tetapi saya melihat peningkatan kinerja substansial atas algoritma semacam Java 8 Collections standar, yang seharusnya merupakan Timsort multi-threadd. Implementasi PSRS saya mengurutkan elemen 40M dalam rata-rata 4985 ms, dibandingkan dengan 19759 ms untuk algoritma pengurutan JDK default.
broadbear