Thuật toán sắp xếp song song nào có hiệu suất trường hợp trung bình tốt nhất?


134

Sắp xếp mất O (n log n) trong trường hợp nối tiếp. Nếu chúng ta có bộ xử lý O (n), chúng ta sẽ hy vọng tăng tốc tuyến tính. Các thuật toán song song O (log n) tồn tại nhưng chúng có hằng số rất cao. Chúng cũng không áp dụng được trên phần cứng hàng hóa không có bộ xử lý O (n). Với bộ xử lý p, các thuật toán hợp lý sẽ mất thời gian O (n / p log n).

Trong trường hợp nối tiếp, sắp xếp nhanh có độ phức tạp thời gian chạy trung bình tốt nhất. Một thuật toán sắp xếp nhanh song song rất dễ thực hiện (xem tại đâyđây ). Tuy nhiên, nó không hoạt động tốt vì bước đầu tiên là phân vùng toàn bộ bộ sưu tập trên một lõi. Tôi đã tìm thấy thông tin về nhiều thuật toán sắp xếp song song nhưng cho đến nay tôi chưa thấy bất cứ điều gì chỉ ra một người chiến thắng rõ ràng.

Tôi đang tìm cách sắp xếp danh sách từ 1 triệu đến 100 triệu phần tử trong ngôn ngữ JVM chạy trên 8 đến 32 lõi.


@Jon Bất cứ điều gì thực sự. Chúng sẽ là các đối tượng miền của tôi khác nhau, nhưng tất cả đều thực hiện So sánh.
Craig P. Motlin

1
Tôi nghĩ rằng bạn có quá nhiều n / p trong "nên lấy"
Sparr

@Sparr Tôi không nghĩ vậy. Tôi đang phân biệt giữa việc có một vài bộ xử lý và có nhiều bộ xử lý như các phần tử được sắp xếp.
Craig P. Motlin

@ CraigP.Motlin đúng, nhưng dường như bạn đã "phân phối" / p một cách sai lầm. Chỉ nên có một / p.
Sparr

@Sparr Ah, đã thay đổi điều đó, cảm ơn.
Craig P. Motlin

Câu trả lời:


204

Bài viết sau đây (tải xuống PDF) là một nghiên cứu so sánh các thuật toán sắp xếp song song trên các kiến ​​trúc khác nhau:

Các thuật toán sắp xếp song song trên các kiến ​​trúc khác nhau

Theo bài báo, sắp xếp mẫu dường như là tốt nhất trên nhiều loại kiến ​​trúc song song.

Cập nhật để giải quyết mối quan tâm của Mark về tuổi tác:

Dưới đây là các bài viết gần đây giới thiệu một cái gì đó mới lạ hơn (từ năm 2007, trong đó, btw, vẫn được so sánh với sắp xếp mẫu):

Những cải tiến về sắp xếp mẫu
AA-Sắp xếp

Rìa chảy máu (khoảng năm 2010, một số chỉ vài tháng tuổi):

Mẫu sắp xếp
song song Phân loại song song dựa trên GPU Sắp xếp song song
CPU / GPU Sắp xếp
song song Thuật toán sắp xếp song song ngẫu nhiên với một nghiên cứu thử nghiệm Sắp xếp
song song có khả năng mở rộng sắp
xếp theo thứ tự tự nhiên: Cách tiếp cận sắp xếp thích ứng mới

Cập nhật cho năm 2013: Đây là giai đoạn xuất huyết vào tháng 1 năm 2013. (Lưu ý: Một số liên kết đến các giấy tờ tại Citeseer và yêu cầu đăng ký miễn phí):

Các bài giảng của trường đại học:
Phân vùng song song để lựa chọn và sắp xếp các thuật toán sắp xếp song song
Bài giảng Thuật toán sắp xếp
song song Bài giảng 2
Thuật toán sắp xếp song song Bài giảng 3

Nguồn và bài báo khác:
Thuật toán sắp xếp mới cho các kiến ​​trúc nhiều lõi dựa trên sắp
xếp
song
song Hợp nhất 2
Hệ thống
tự sắp xếp song song cho các đối tượng Hiệu suất So sánh các thuật toán sắp xếp nhanh liên tục và sắp xếp nhanh song song
Bộ nhớ chia sẻ, chuyển tin nhắn và sắp xếp kết hợp cho SMP độc lập và cụm sao
Các thuật toán song song khác nhau (sắp xếp et al) bao gồm cả việc triển khai

GPU và CPU / GPU nguồn hybrid và các giấy tờ:
Một phương pháp OpenCL của Parallel thuật toán sắp xếp cho GPU Kiến trúc
dữ liệu phân loại Sử dụng Graphics Processing Units
thuật toán hiệu quả để phân loại trên GPU
thuật toán phân loại hiệu quả Thiết kế cho manycore GPU
xác định mẫu Sắp xếp Đối với GPU
nhanh tại chỗ sắp xếp với CUDA dựa trên sắp xếp bitonic Sắp xếp
GPU song song nhanh bằng thuật toán lai Thuật toán sắp xếp
song song nhanh trên GPU
Sắp xếp nhanh trên CPU và GPU: trường hợp sắp xếp băng thông SIMD sắp xếp theo
mẫu
GPU GPU-ABiSort: Sắp xếp song song tối ưu trên Kiến trúc
truyền phát trực tuyến GPUTeraSort phân loại đồng xử lý đồ họa hiệu năng để quản lý cơ sở dữ liệu lớn
Thuật toán sắp xếp dựa trên so sánh hiệu suất cao trên GPU nhiều lõi
Sắp xếp bên ngoài song song cho GPU hỗ trợ CUDA với cân bằng tải và phí truyền tải thấp
Sắp xếp trên GPU cho bộ dữ liệu quy mô lớn: So sánh kỹ lưỡng


2
Đây là một nghiên cứu so sánh các thuật toán sắp xếp song song trên các kiến ​​trúc khác nhau hiện tại vào năm 1996. Rất nhiều thay đổi trong tính toán song song kể từ đó.
Đánh dấu hiệu suất cao

1
Có vẻ như bạn đã bỏ lỡ những gì IMHO tốt nhất trong tất cả, Thực hiện hiệu quả Sắp xếp trong kiến ​​trúc SIMD đa lõi. Từ nghiên cứu của Intel, được trình bày tại VLDB năm 2008
alecco

1
Đây sẽ là một câu trả lời tuyệt vời, một lần. Bây giờ, hầu hết các liên kết bị hỏng.
Tim Long

6

Tôi đã làm việc với cả thuật toán Parallel Quicksort và thuật toán PSRS về cơ bản kết hợp quicksort song song với việc hợp nhất.

Với thuật toán Parallel Quicksort, tôi đã chứng minh gần tăng tốc tuyến tính với tối đa 4 lõi (lõi kép với siêu phân luồng), dự kiến ​​sẽ đưa ra các hạn chế của thuật toán. Parallel Quicksort thuần túy dựa trên tài nguyên ngăn xếp được chia sẻ, điều này sẽ dẫn đến sự tranh chấp giữa các luồng, do đó làm giảm bất kỳ mức tăng nào trong hiệu suất. Ưu điểm của thuật toán này là nó sắp xếp 'tại chỗ', giúp giảm lượng bộ nhớ cần thiết. Bạn có thể muốn xem xét điều này khi sắp xếp lên tới 100M phần tử như bạn đã nêu.

Tôi thấy bạn đang tìm cách sắp xếp trên một hệ thống có 8-32 lõi. Thuật toán PSRS tránh sự tranh chấp ở tài nguyên được chia sẻ, cho phép tăng tốc ở số lượng quá trình cao hơn. Tôi đã trình diễn thuật toán với tối đa 4 lõi như trên, nhưng kết quả thử nghiệm của những người khác báo cáo gần tốc độ tuyến tính với số lượng lõi lớn hơn nhiều, 32 và hơn thế nữa. Nhược điểm của thuật toán PSRS là nó không tại chỗ và sẽ cần nhiều bộ nhớ hơn.

Nếu bạn quan tâm, bạn có thể sử dụng hoặc kiểm tra mã Java của tôi cho từng thuật toán này. Bạn có thể tìm thấy nó trên github: https://github.com/broadbear/sort . Mã này được dự định là một sự thay thế thả xuống của Java Collections.sort (). Nếu bạn đang tìm kiếm khả năng thực hiện sắp xếp song song trong một JVM như bạn nêu ở trên, mã trong repo của tôi có thể giúp bạn giải quyết. API được khái quát hóa hoàn toàn cho các yếu tố triển khai So sánh hoặc triển khai Trình so sánh của riêng bạn.

Tôi có thể hỏi những gì bạn đang tìm kiếm để sắp xếp nhiều yếu tố cho? Tôi muốn biết các ứng dụng tiềm năng cho gói sắp xếp của tôi.


Tôi có một bộ xử lý 8 lõi. :) Bây giờ tôi đã thử nghiệm sắp xếp lên tới 40M phần tử. Tôi không thấy tăng tốc tuyến tính, nhưng tôi đang thấy hiệu suất tăng đáng kể so với thuật toán sắp xếp Bộ sưu tập Java 8 tiêu chuẩn, được cho là Timsort đa năng. Việc triển khai PSRS của tôi sắp xếp các phần tử 40M trong trung bình 4985 ms, so với 19759 ms cho thuật toán sắp xếp JDK mặc định.
Broadbear


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.