Hangi paralel sıralama algoritması en iyi ortalama durum performansına sahiptir?


134

Sıralama, seri durumda O (n log n) alır. O (n) işlemcilerimiz varsa, doğrusal bir hızlanma umarız. O (log n) paralel algoritmalar mevcuttur ancak sabitleri çok yüksektir. Ayrıca, O (n) işlemcilere yakın bir yere sahip olmayan ticari donanımlar için de geçerli değildir. P işlemcilerle, makul algoritmalar O (n / p log n) süresi almalıdır.

Seri durumda, hızlı sıralama ortalama olarak en iyi çalışma zamanı karmaşıklığına sahiptir. Paralel hızlı sıralama algoritmasının uygulanması kolaydır ( buraya ve buraya bakın ). Ancak, ilk adım tüm koleksiyonu tek bir çekirdekte bölmek olduğu için iyi performans göstermiyor. Birçok paralel sıralama algoritması hakkında bilgi buldum, ancak şu ana kadar açık bir kazananı gösteren hiçbir şey görmedim.

8 ila 32 çekirdek üzerinde çalışan bir JVM dilinde 1 milyon ila 100 milyon öğeden oluşan listeleri sıralamak istiyorum.


@Jon Anything gerçekten. Hepsi farklı olan, ancak hepsi Comparable'ı uygulayan alan nesnelerim olacaklar.
Craig P. Motlin

1
Sanırım "almalısın" da çok fazla n / p var
Sparr

@Sparr Sanmıyorum. Birkaç işlemciye sahip olmak ile sıralanan öğeler kadar çok işlemciye sahip olmak arasında bir ayrım yapıyorum.
Craig P. Motlin

@ CraigP.Motlin doğru, ancak / p'yi hatalı bir şekilde "dağıtmış" görünüyorsunuz. Yalnızca bir / p olmalıdır.
Sparr

@Sparr Ah, bunu değiştirdi, teşekkürler.
Craig P. Motlin

Yanıtlar:


206

Aşağıdaki makale (PDF indirme), çeşitli mimarilerdeki paralel sıralama algoritmalarının karşılaştırmalı bir çalışmasıdır:

Çeşitli mimarilerde paralel sıralama algoritmaları

Makaleye göre, örnek sıralama birçok paralel mimari türünde en iyisi gibi görünüyor.

Mark'ın yaşla ilgili endişesini gidermek için güncelleme:

İşte daha yeni bir şeyi tanıtan daha yeni makaleler (2007'den itibaren, btw, hala örnek sıralama ile karşılaştırılıyor):

AA-Sıralama örneklem sıralamasında iyileştirmeler

Kanayan uç (2010 dolaylarında, bazıları yalnızca birkaç aylık):

Paralel sıralama modeli
Çok çekirdekli GPU tabanlı paralel sıralama
Hibrit CPU / GPU paralel sıralama
Deneysel Çalışma ile Rastgele Paralel Sıralama Algoritması
Yüksek düzeyde ölçeklenebilir paralel sıralama
Doğal Sıra Kullanarak N-Öğelerini Sıralama: Yeni Bir Uyarlanabilir Sıralama Yaklaşımı

2013 için güncelleme: İşte Ocak 2013 civarında kanayan kenar. (Not: Bağlantılardan birkaçı Citeseer'daki makalelere yöneliktir ve ücretsiz kayıt gerektirir):

Üniversite dersleri:
Paralel
Sıralama Algoritmaları Seçim ve Sıralama için Paralel Bölümleme Ders
Paralel Sıralama Algoritmaları Ders 2
Paralel Sıralama Algoritmaları Ders 3

Diğer kaynaklar ve makaleler:
Çok çekirdekli mimariler için uyarlanabilir biytonik sıralamayı temel alan yeni bir sıralama algoritması
Yüksek Ölçeklenebilir Paralel Sıralama 2
Paralel Birleştirme
Paralel
Nesneler için 2 Paralel Kendi Kendini Sıralama Sistemini Birleştirme
Sıralı Hızlı Sıralama ve Paralel Hızlı Sıralama Algoritmalarının Performans Karşılaştırması
Bağımsız ve Kümelenmiş SMP'ler için Paylaşılan Bellek, İleti Aktarma ve Karma Birleştirme Sıralaması
Çeşitli paralel algoritmalar (sıralama ve diğerleri) uygulamalar dahil

GPU ve CPU / GPU hibrit kaynakları ve kağıtları: Grafik İşleme Birimlerini Kullanarak
GPU Mimarisi
Veri Sıralama için OpenCL Paralel Sıralama Algoritmaları Yöntemi
GPU'larda Sıralama İçin Verimli Algoritmalar Çok
çekirdekli GPU'lar için verimli sıralama algoritmaları tasarlama GPU'lar için
Belirleyici Örnek Sıralama GPU'lar için
hızlı yerinde sıralama Biytonik sınıflandırmaya dayalı CUDA
Karma algoritma kullanarak hızlı paralel GPU sıralama
GPU'larda Hızlı Paralel Sıralama Algoritmaları
CPU'larda ve GPU'larda hızlı sıralama: bant genişliğine dikkat etmeyen SIMD sıralama
GPU örnek sıralama için bir durum
GPU-ABiSort: Akış Mimarilerinde Optimal Paralel Sıralama
GPUTeraSort: yüksek büyük veritabanı yönetimi için performans grafik ortak işlemci sıralama
Çok çekirdekli GPU'larda yüksek performanslı karşılaştırma tabanlı sıralama algoritması
Yük dengeleme ve düşük aktarım ek yükü ile CUDA etkin GPU'lar için paralel harici sıralama
Büyük ölçekli veri kümeleri için GPU'larda sıralama: Kapsamlı bir karşılaştırma


2
1996'da geçerli olan çeşitli mimariler üzerinde paralel sıralama algoritmalarının karşılaştırmalı bir çalışmasıdır. O zamandan beri paralel hesaplamada çok şey değişti.
Yüksek Performans Markası

1
Görünüşe göre IMHO'nun en iyisi olan, Çok çekirdekli SIMD mimarisinde Verimli Sıralama Uygulaması'nı kaçırmışsınız. Intel araştırmasından, VLDB 2008'de sunulmuştur.
alecco

1
Bu bir zamanlar harika bir cevap olabilirdi. Şimdi, bağlantıların çoğu koptu.
Tim Long

6

Hem Paralel Hızlı Sıralama algoritması hem de hızlı sıralamayı birleştirmeyle paralel olarak birleştiren bir PSRS algoritması ile çalıştım.

Parallel Quicksort algoritmasıyla, algoritmanın sınırlamaları göz önüne alındığında beklenen 4 çekirdeğe kadar (hiper iş parçacıklı çift çekirdek) neredeyse doğrusal hızlanma gösterdim. Saf bir Paralel Hızlı Sıralama, iş parçacıkları arasında çekişmeye neden olacak ve böylece performanstaki herhangi bir kazancı azaltacak paylaşılan bir yığın kaynağına dayanır. Bu algoritmanın avantajı, gerekli bellek miktarını azaltan 'yerinde' sıralamasıdır. Bunu belirttiğiniz gibi 100 milyondan fazla öğeyi sıralarken göz önünde bulundurmak isteyebilirsiniz.

8-32 çekirdekli bir sistemde sıralama aradığınızı görüyorum. PSRS algoritması, paylaşılan kaynakta çekişmeyi önler ve daha yüksek sayıda işlemde hızlanma sağlar. Yukarıdaki gibi 4 çekirdeğe kadar algoritmayı gösterdim, ancak diğerlerinin deneysel sonuçları, çok daha fazla sayıda çekirdek 32 ve ötesi ile neredeyse doğrusal hızlanma rapor ediyor. PSRS algoritmasının dezavantajı, yerinde olmaması ve önemli ölçüde daha fazla bellek gerektirmesidir.

İlgileniyorsanız, bu algoritmaların her biri için Java kodumu kullanabilir veya inceleyebilirsiniz. Bunu github'da bulabilirsiniz: https://github.com/broadbear/sort . Kod, Java Collections.sort () yerine geçmeli olarak tasarlanmıştır. Yukarıda belirttiğiniz gibi bir JVM'de paralel sıralama gerçekleştirme yeteneği arıyorsanız, depomdaki kod size yardımcı olabilir. API, Comparable'ı uygulayan veya kendi Karşılaştırıcınızı uygulayan öğeler için tamamen genelleştirilmiştir.

Bu kadar çok unsuru neye ayırmak istediğinizi sorabilir miyim? Sıralama paketim için olası uygulamaları bilmekle ilgileniyorum.


8 çekirdekli bir işlemcim var. :) Şimdi 40M elementleri sıralamayı test ettim. Doğrusal hızlanma görmüyorum, ancak varsayılan olarak çok iş parçacıklı bir Timsort olan standart Java 8 Collections sıralama algoritmasına göre önemli performans kazancı görüyorum. PSRS uygulamam, 40M öğeleri, varsayılan JDK sıralama algoritması için 19759 ms ile karşılaştırıldığında ortalama 4985 ms'de sıralar.
broadbear


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.