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


134

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

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

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.