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

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

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

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



답변

다음 기사 (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 정렬 : 철저한 비교


답변

병렬 퀵 정렬 알고리즘과 퀵 정렬을 병합과 병렬로 결합하는 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를 구현하는 요소에 대해 완전히 일반화됩니다.

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


답변

이 논문을 살펴보십시오 : 정확한 분할을 사용한 확장 가능한 병렬 정렬 알고리즘 . 32 개가 넘는 코어와 관련이 있습니다. 그러나 O (n / p * log (n) + p * log (n) ** 2)의 실행 시간 복잡도를 갖는 알고리즘을 자세히 설명하고 임의 비교기에 적용 할 수 있습니다.


답변

“다른 아키텍처에서 병렬 정렬 알고리즘의 비교” 문서 를 시작하는 것이 좋습니다.


답변