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.