최고의 평균 케이스 성능을 갖는 병렬 정렬 알고리즘은 무엇입니까?


134

일련의 경우 정렬은 O (n log n)를 사용합니다. 만약 우리가 O (n) 프로세서를 가지고 있다면 우리는 선형 속도 향상을 원할 것입니다. O (log n) 병렬 알고리즘이 존재하지만 상수가 매우 높습니다. 또한 O (n) 프로세서 근처에없는 상용 하드웨어에는 적용되지 않습니다. p 프로세서의 경우 합리적인 알고리즘은 O (n / p log n) 시간이 걸립니다.

일련의 경우 빠른 정렬은 평균적으로 런타임 복잡성이 가장 좋습니다. 병렬 빠른 정렬 알고리즘은 구현하기 쉽습니다 ( here 및 here 참조 ). 그러나 첫 번째 단계는 전체 컬렉션을 단일 코어로 분할하는 것이므로 성능이 좋지 않습니다. 많은 병렬 정렬 알고리즘에 대한 정보를 찾았지만 지금까지 명확한 승자를 가리키는 것은 없습니다.

8 ~ 32 개의 코어에서 실행되는 JVM 언어로 1 ~ 1 억 개의 요소 목록을 정렬하려고합니다.


@Jon Anything 정말로. 그것들은 모두 다르지만 모두 Comparable을 구현하는 내 도메인 객체가 될 것입니다.
— Craig P. Motlin

1
"당신이 가져 가야 할 것"에 n / p가 너무 많다고 생각합니다
— Sparr

@ 스파 르 나는 그렇게 생각하지 않습니다. 나는 몇 개의 프로세서를 갖는 것과 정렬되는 요소만큼 많은 프로세서를 갖는 것을 구별하고 있습니다.
— Craig P. Motlin

@ CraigP.Motlin은 맞습니다. 그러나 / p를 잘못 배포 한 것 같습니다. / p는 하나만 있어야합니다.
— Sparr

@Sparr Ah 감사합니다.
— Craig P. Motlin

답변:


206

다음 기사 (PDF 다운로드)는 다양한 아키텍처의 병렬 정렬 알고리즘에 대한 비교 연구입니다.

다양한 아키텍처의 병렬 정렬 알고리즘

이 기사에 따르면 샘플 정렬 은 많은 병렬 아키텍처 유형에서 가장 좋은 것으로 보입니다.

Mark의 연령 문제를 해결하기 위해 업데이트 :

다음은 더 새로운 것을 소개하는 최신 기사입니다 (2007 년 btw, 여전히 샘플 정렬과 비교됨).

샘플 분류 AA-Sort 개선

출혈 가장자리 (2010 년경, 몇 달 전) :

병렬 정렬 패턴
많은 코어 GPU 기반 병렬 정렬
하이브리드 CPU / GPU 병렬 정렬
실험적 연구를 통한 무작위 병렬 정렬 알고리즘 자연 순서를 사용한
확장 성이 뛰어난 병렬
정렬 N- 요소 정렬 : 새로운 적응 정렬 방법

2013 년 업데이트 : 2013 년 1 월 경 최첨단 기술이 적용됩니다. (참고 : 일부 링크는 Citeseer의 논문으로 연결되며 무료로 등록해야합니다) :

대학 강의 :
선택 및 정렬을위한 병렬 파티셔닝
병렬 정렬 알고리즘 강의
병렬 정렬 알고리즘 강의 2
병렬 정렬 알고리즘 강의 3

다른 소스 및 논문 :
적응 형 바이 토닉 정렬을 기반으로하는 많은 코어 아키텍처를위한 새로운 정렬 알고리즘
고 확장 병렬 정렬 2
병렬 병합
병렬 독립형 및 클러스터 된 SMP를위한 순차적 병렬 정렬 및 병렬 빠른 정렬 알고리즘의 공유 메모리, 메시지 전달 및 하이브리드 병합 정렬에 대한 2 개의
병렬 자체 정렬 시스템 병합
성능 구현 비교 구현을 포함한 다양한 병렬 알고리즘 (정렬 등)



GPU와 CPU / GPU 하이브리드 소스 및 논문 :
GPU 아키텍처에 대한 병렬 정렬 알고리즘의 OpenCL을 방법
그래픽 처리 장치 사용하여 데이터 정렬
GPU에서 정렬을 위해 효율적인 알고리즘을
매니 코어 GPU를위한 설계 효율적인 정렬 알고리즘
의 GPU를 들어 정렬 결정적 샘플
빠른에서 현재 위치와 정렬 비트 코닉 정렬 기반의 CUDA
하이브리드 알고리즘을 사용한 고속 병렬 GPU 분류 GPU의
고속 병렬 정렬 알고리즘
CPU 및 GPU의 고속 분류 : 대역폭을 모르는 SIMD 정렬
GPU 샘플 의 경우
GPU-ABiSort : 스트림 아키텍처에서 최적의 병렬 정렬
GPUTeraSort : 높음 대규모 데이터베이스 관리를위한 고성능 그래픽 코 프로세서 정렬
많은 코어 GPU의 고성능 비교 기반 정렬 알고리즘
로드 밸런싱 및 전송 오버 헤드가 낮은 CUDA 지원 GPU의 병렬 외부 정렬
대규모 데이터 세트를위한 GPU 정렬 : 철저한 비교


2
1996 년 현재 다양한 아키텍처에 대한 병렬 정렬 알고리즘에 대한 비교 연구입니다. 그 이후로 병렬 컴퓨팅에서 많은 변화가있었습니다.
— 고성능 마크

1
멀티 코어 SIMD 아키텍처에서 가장 효과적인 정렬 방법의 IMHO가 무엇인지 놓친 것 같습니다. VLDB 2008에서 발표 된 인텔 리서치에서
— alecco

1
이것은 한 번 큰 대답이었습니다. 이제 대부분의 링크가 끊어졌습니다.
— Tim Long

6

병렬 퀵 정렬 알고리즘과 퀵 정렬을 병합과 병렬로 결합하는 PSRS 알고리즘을 모두 사용했습니다.

Parallel Quicksort 알고리즘을 사용하면 알고리즘의 한계를 감안할 때 최대 4 코어 (하이 스레딩이있는 이중 코어)로 거의 선형 속도 향상을 시연했습니다. 순수한 Parallel Quicksort는 공유 스택 리소스를 사용하므로 스레드간에 경합이 발생하여 성능 향상이 줄어 듭니다. 이 알고리즘의 장점은 'in-place'로 정렬하여 필요한 메모리 양이 줄어든다는 것입니다. 언급 한대로 100M 이상의 요소를 정렬 할 때이를 고려할 수 있습니다.

8-32 코어 시스템에서 정렬하려고합니다. PSRS 알고리즘은 공유 리소스에서의 경합을 피하여 더 많은 수의 프로세스에서 속도를 높일 수 있습니다. 위와 같이 최대 4 코어의 알고리즘을 시연했지만 다른 실험 결과는 훨씬 많은 수의 코어, 32 이상에서 선형 속도 향상에 가깝습니다. PSRS 알고리즘의 단점은 제자리에 있지 않으며 상당히 많은 메모리가 필요하다는 것입니다.

관심이 있으시면 각 알고리즘마다 Java 코드를 사용하거나 숙독하십시오. : 당신은 GitHub의에서 찾을 수 있습니다 https://github.com/broadbear/sort . 이 코드는 Java Collections.sort ()의 드롭 인 대체 용으로 고안되었습니다. 위에서 언급 한대로 JVM에서 병렬 정렬을 수행하는 기능을 찾고 있다면 내 저장소의 코드가 도움이 될 수 있습니다. API는 Comparable을 구현하거나 자체 Comparator를 구현하는 요소에 대해 완전히 일반화됩니다.

많은 요소를 정렬하려는 항목을 물어봐도 될까요? 정렬 패키지의 잠재적 응용 프로그램에 대해 알고 싶습니다.


8 코어 프로세서가 있습니다. :) 이제 40M 이상의 요소 정렬을 테스트했습니다. 선형 속도 향상은 보이지 않지만 다중 스레드 Timsort 인 표준 Java 8 Collections 정렬 알고리즘보다 성능이 크게 향상되었습니다. 내 PSRS 구현은 기본 JDK 정렬 알고리즘의 경우 19759ms와 비교하여 평균 4985ms에서 40M 요소를 정렬합니다.
— broadbear


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.