샘플포트
SamplesortSamplesort는 병렬 처리 시스템에서 자주 사용되는 분할 및 정복 알고리즘인 분류 알고리즘이다.[1]전통적인 분할 및 정복 정렬 알고리즘은 배열을 하위 인터벤션 또는 버킷으로 분할한다.그런 다음 버킷을 개별적으로 정렬하고 함께 연결한다.그러나 어레이가 균일하지 않게 분포된 경우 이러한 정렬 알고리즘의 성능을 크게 조절할 수 있다.sampleort는 n-element 시퀀스에서 s 크기의 샘플을 선택하고, 샘플을 정렬하여 버킷의 범위를 결정하고, 결과에서 p-1 < s 요소를 선택하여 이 문제를 해결한다.이러한 요소(스플리터라고 함)는 배열을 대략적으로 동일한 크기의 버킷 p로 나눈다.[2]샘플포트는 W. D. Frazer와 A. C. McKellar의 1970년 논문 "샘플포트: 최소 저장 트리 정렬에 대한 샘플링 접근법"에 설명되어 있다.[3]
알고리즘.
견본은 퀵소트의 일반화다.퀵소트가 피벗이라는 단일 값에 기초하여 각 단계에서 입력을 두 부분으로 분할하는 경우, 샘플소트는 대신 입력에서 더 큰 샘플을 가져오고 그에 따라 데이터를 버킷으로 나눈다.퀵소트처럼 양동이를 재귀적으로 정렬한다.
견본 구현을 구상하려면 버킷 p의 개수를 결정해야 한다.이 작업이 완료되면 실제 알고리즘은 다음과 같은 세 가지 단계로 작동한다.[4]
- 입력(스플리터)에서 p-1 원소를 샘플링한다.이러한 항목을 정렬하고, 각 인접한 분할자 쌍은 버킷을 정의한다.
- 데이터를 반복하여 각 요소를 적절한 버킷에 배치하십시오(이 말은 멀티프로세서 시스템에서 프로세서로 전송).
- 각 버킷을 정렬하십시오.
전체 정렬된 출력은 버킷의 연결이다.
공통 전략은 p를 사용 가능한 프로세서 수와 동일하게 설정하는 것이다.그런 다음 데이터는 프로세서 간에 분산되어 다른 순차 정렬 알고리즘을 사용하여 버킷 정렬을 수행한다.
가성음
다음 목록은 위에서 언급한 3단계 알고리즘을 가성으로 보여주고 알고리즘이 원칙적으로 어떻게 작동하는지 보여준다.[5]다음에서 A는 비정렬 데이터, k는 과표본 인자, p는 분할자의 수이다.
만약 평균 양동이 크기 모두에게 문턱 스위치 아래에 있quicksort 만약 n/k<>기능 sampleSort(A[1..n], k, p).;{\displaystyle n/k<.}한곈 다음/* 1단계*/smallSort(A)S)[S1,…, S(p− 1)k]무작위로//select샘플와는 아주{S=[S_{1}{(p-1)k,S_ ,\dots}]\displaystyle}을 선택합니다 //.rt S// sort sample // select splitters /* Step 2 */ for each find j sUch이 sj− 1<>;s≤ j{\displaystyle s_{j-1}<, a\leq s_{j}} 곳에 양동이 bj{\displaystyle b_{j}}/* 3단계와 적은 연쇄 */ 복귀 이어진(sampleSort(b1), …,sampleSort(bkm그리고 4.9초 만)){\displaystyle{\texttt{결부시키다}}({\texttt{sampleSort}}(b_{1}),.\dots
사이비 코드는 원래의 프레이저와 맥켈라 알고리즘과는 다르다.[3]사이비 코드에서는 샘플ort를 재귀적으로 부른다.Frazer와 McKellar는 단 한 번 sampleort에 전화를 했고, 이후의 모든 반복에서 퀵소트를 사용했다.
복잡성
프로세서와 병렬 구현을 위한 복잡성(Big O 표기법):
스플리터를 찾아라.
양동이로 보내세요.
- 노드를위한 O ) {\ O
- log ()을(를) 브로드캐스트에 사용
- p ( p) 모든 키에 대한 이진 검색
- p) 를 클릭하여 버킷으로 키를 전송하십시오.
버킷을 정렬하십시오.
- ( ( p {n 여기서 c (는 기본 순차 정렬 방법의 복잡성이다.[1]c () = log ( ) .
이 알고리즘에 의해 수행된 비교 횟수는 큰 입력 시퀀스에 대한 정보 이론적 최적 에 접근한다.Frazer와 McKellar에 의해 수행된 실험에서 알고리즘은 퀵소트보다 15% 적은 비교가 필요했다.
데이터 샘플링
데이터는 다른 방법을 통해 샘플링될 수 있다.일부 방법에는 다음이 포함된다.
- 균일한 간격으로 샘플을 채취한다.
- 랜덤하게 선택한 표본을 선택하십시오.
오버샘플링
과표본 비율은 분할자를 결정하기 전에 표본으로 추출할 데이터 요소의 수를 결정한다.목표는 데이터의 분포를 잘 표현하는 것이다.중복된 값이 많지 않다는 점에서 데이터 값이 광범위하게 분포되어 있다면 작은 표본 추출비로 충분하다.그 밖의 분포에 중복이 많은 경우에는 더 큰 과표본 비율이 필요할 것이다.이상적인 경우, 2단계 이후 각 버킷에는 / 요소가 포함되어 있다.이 경우 모든 버킷의 크기가 같기 때문에 다른 버킷보다 정렬하는 데 시간이 오래 걸리지 않는다.
이상의 k 번 샘플을 채취한 후 샘플이 정렬된다.Thereafter, the splitters used as bucket boundaries are the samples at position of the sample sequence (together with and as left and right boundaries for the left most and right most buckets respecti이것은 단순히 splitter를 무작위로 선택하는 것보다 좋은 분할자에게 더 나은 휴리스틱을 제공한다.
버킷 크기 추정치
결과 표본 크기로 예상 버킷 크기 및 특히 버킷이 특정 크기를 초과할 확률을 추정할 수 있다.The following will show that for an oversampling factor of the probability that no bucket has more than elements is larger than 스타일 .
이를 표시하기 위해e ,… , n {\1},\을(를) 정렬된 시퀀스로 입력하도록 하십시오.프로세서가(+ ) / )\ n개 이상의 요소를 얻으려면 길이 +)n / p{\)\n/의 입력에 연속성이 있어야 하며 이 중 최대 S 샘플이 선택된다.이러한 경우는 P 확률을 구성한다이를 랜덤 변수로 나타낼 수 있다.
의 예상 값에 대해 다음을 유지하십시오.
값은 p l :
지금 Chernoff 바인딩을 사용하여 다음과 같이 표시할 수 있다.
많은 동일한 키
동일한 키가 많은 경우 알고리즘은 전체 시퀀스가 동일한 키로 구성되기 때문에 시퀀스가 정렬되는 많은 반복 레벨을 거친다.이것은 평등 양동이를 도입함으로써 상쇄될 수 있다.피벗과 동일한 요소는 각각의 평등 버킷으로 분류되며, 이는 하나의 추가 조건 분기로만 구현될 수 있다.평등 양동이는 더 이상 분류되지 않는다./ 회 이상 발생하는 키가 피벗이 될 가능성이 높기 때문에 이 작업이 가능하다.
병렬 시스템에서 사용
샘플포트는 대량 동기 병렬 기계와 같은 분산 시스템을 포함하여 병렬 시스템에서 자주 사용된다.[6][4][7]스플리터의 가변적인 양 때문에(Quicksort에서 하나의 피벗만 사용하는 것과는 대조적으로), 샘플포트는 병렬화 및 스케일링에 매우 적합하고 직관적이다.더욱이 샘플포트 또한 퀵소트 등의 구현보다 캐시 효율적이다.
병렬화는 각 프로세서 또는 노드에 대해 정렬을 분할하여 구현되는데, 여기서 버킷의 수는 개 프로세서수와 동일하다. 각 프로세서가 대략 동일한 np {\/p}을 받기 때문에 샘플 포트는 병렬 시스템에서 효율적이다 버킷이 그러하므로동시에, 프로세서는 거의 동시에 정렬을 완료할 것이며, 따라서 프로세서가 다른 프로세서를 기다릴 필요가 없다.
분산 시스템에서 분할자는 각 프로세서의 요소를 가져와서 결과 p 요소를 분산 정렬하고 -th 요소마다 가져가고 결과를 모든 프로세서에 브로드캐스트하여 선택한다.This costs for sorting the elements on processors, as well as for distributing the chosen splitters to 프로세서.
결과 분할기로 각 프로세서는 자체 입력 데이터를 로컬 버킷에 배치한다.이 작업은 이진 검색으로 / p log ) { p이(가) 필요하다.이후 로컬 버킷이 프로세서로 재배포된다.프로세서 은(는) 다른 모든 프로세서의 로컬 버킷 를 가져와 로컬로 정렬한다.배포에는 , ) 시간이 소요되며 여기서 은 가장 큰 버킷의 크기입니다.로컬 정렬은 (.
1990년대 초 Connection Machine 슈퍼컴퓨터에서 수행된 실험에서는 샘플이 프로세서 간 통신 오버헤드를 거의 유발하지 않기 때문에 이러한 기계에서 대규모 데이터셋을 분류하는 데 특히 뛰어난 것으로 나타났다.[8]후자의 GPU에서는 알고리즘이 대안보다 덜 효과적일 수 있다.[9][citation needed]
샘플 포트의 효율적인 구현
위에서 설명한 대로 샘플포트 알고리즘은 선택된 분할자에 따라 요소를 분할한다.효율적인 구현 전략은 "Super Scalar Sample Sort"[5]라는 논문에서 제안된다.본 문서에서 제안한 구현은 효율적인 구현을 위해 n n n의 두 어레이(입력 데이터와 임시 어레이를 포함하는 원래 어레이)를 사용한다.따라서 이 구현 버전은 인플레이스 알고리즘이 아니다.
각 재귀 단계에서 데이터는 분할된 방식으로 다른 배열로 복사된다.마지막 재귀 단계에서 데이터가 임시 배열에 있으면 데이터가 원래 배열에 다시 복사된다.
버킷 결정
비교 기반 정렬 알고리즘에서 비교 연산은 가장 성능에 중요한 부분이다.샘플 포트에서 이는 각 요소의 버킷을 결정하는 것과 일치한다.이 작업에는 각 에 대해 k 시간이 필요하다.
Super Scalar Sample Sort는 배열 t에 암시적으로 저장된 균형 잡힌 검색 트리를 사용한다.루트는 0에 저장되고 i 의 왼쪽 계승자는 2}에 저장되며, 오른쪽 는 t + 에 저장된다 검색 트리 t를 감안하여 은 요소의 버킷 number j를 다음과 같이 계산한다.lows( > t > j{\는 참이면 1로, 그렇지 않으면 0으로 평가한다.
컴파일 시 버킷 k의 개수를 알 수 있으므로 컴파일러에 의해 이 루프를 해제할 수 있다.비교 연산은 사전 결정된 지침으로 시행한다.따라서 분기 오차가 발생하지 않아 비교 작업이 상당히 느려질 수 있다.
파티셔닝
요소의 효율적인 파티셔닝을 위해 알고리즘은 사전에 버킷의 크기를 알아야 한다.시퀀스의 요소를 분할하여 배열로 넣으려면 버킷의 크기를 미리 알아야 한다.순진한 알고리즘은 각 버킷의 요소 수를 셀 수 있다.그런 다음 원소를 올바른 위치에 있는 다른 배열로 삽입할 수 있다.이를 이용해 각 원소의 버킷을 두 번(버킷의 원소 수를 세는 1회, 삽입하는 1회) 결정해야 한다.
이러한 비교의 두 배가 되지 않도록 Super Scalar Sample Sort는 요소의 각 인덱스를 버킷에 할당하는 추가 어레이 오라클이라고 함)를 사용한다.먼저 알고리즘은 각 요소와 버킷 크기에 대한 버킷을 결정한 다음 에 의해 결정된 버킷에 요소를 배치하여 의 내용을 결정한다어레이 도 스토리지 공간에 비용을 발생시키지만 n 로그 k비트만 저장하면 되기 때문에 이러한 비용은 입력 어레이의 공간에 비해 작다.
인플레이스 샘플포트
위에 제시된 효율적인 샘플포트 구현의 주요 단점은 그 안에 있지 않고 정렬 시 입력 순서와 동일한 크기의 두 번째 임시 배열이 필요하다는 것이다.예를 들어, 퀵소트의 효율적인 구현은 공간 효율성이 더 높다.단, 샘플포트는 사내에서도 구현할 수 있다.[10]
인플레이스 알고리즘은 다음 4단계로 구분된다.
- 위의 샘플링과 동등한 샘플링으로 효율적인 구현을 언급했다.
- 각 프로세서의 로컬 분류 - 각 블록의 모든 요소가 동일한 버킷에 속하도록 입력을 블록으로 그룹화하지만 버킷이 반드시 메모리에서 연속되는 것은 아니다.
- 블록 순열은 블록을 전체적으로 정확한 순서로 만든다.
- 정리는 버킷의 가장자리에서 일부 요소를 이동시킨다.
이 알고리즘의 한 가지 분명한 단점은 분류 단계와 블록 순열 단계에서 한 번 모든 요소를 두 번 읽고 쓰는 것이다.그러나 알고리즘은 다른 아트 인플레이스 경쟁자 상태보다 최대 3배, 다른 아트 순차 경쟁자 상태보다 최대 1.5배 빠른 성능을 발휘한다.샘플링에 대해서는 이미 위에서 논의한 바와 같이, 이후의 3단계는 다음에서 더 자세히 설명될 것이다.
국부구분
첫 번째 단계에서 입력 어레이는 프로세서당 하나씩 동일한 크기의 의 p 줄무늬로 분할된다.각 프로세서는 블록에 한 크기의k {\k} 버퍼를 버킷당 하나씩 추가로 할당한다.이후 각 프로세서는 스트라이프를 스캔하고 요소를 해당 버킷의 버퍼로 이동시킨다.버퍼가 가득 찬 경우, 버퍼는 프로세서 스트라이프에 기록되며, 전면에서 시작한다.버퍼 작성(즉, 버퍼가 꽉 찼음)을 위해서는 적어도 다시 작성된 요소보다 더 많은 요소의 전체 버퍼 크기를 검사해야 하기 때문에 항상 최소 하나 이상의 빈 메모리의 버퍼 크기가 있다.따라서 모든 전체 블록에는 동일한 버킷의 요소가 포함되어 있다.스캔하는 동안 각 버킷의 크기는 추적된다.
블록 순열
첫째, 버킷의 경계를 계산하는 접두사 합계 연산이 수행된다.그러나 이 단계에서는 전체 블록만 이동하기 때문에 경계는 블록 크기의 배수로 반올림되고 단일 오버플로 버퍼는 할당된다.블록 순열을 시작하기 전에 일부 빈 블록을 버킷 끝으로 이동해야 할 수 있다.그 후, 버킷에 대한 b i 하위 배열의 시작으로 쓰기 포인터가 설정되고 읽기 포인터 각 버킷에 대한 버킷 하위 배열의 마지막 비어 있지 않은 블록으로 설정된다.
작업 경합을 제한하기 위해 각 프로세서에는 각각 블록을 보유할 수 있는 다른 기본 버킷 p m 과(와) 두 개의 스왑 버퍼가 할당된다.각 단계에서 두 스왑 버퍼가 모두 비어 있는 경우 프로세서는 기본 버킷의 읽기 포인터 m 을(를) 줄이고 r - 에서 블록을 읽어 스왑 버퍼 중 하나에 배치한다.블록의 첫 번째 요소를 분류하여 블록의 대상 버킷 을(를) 결정한 후 d e 에 있는 블록을 읽고블록을 다른 버퍼에 기록한다.목적지 버킷까지. > > r d 스왑 버퍼는 다시 비어 있다그렇지 않으면 스왑 버퍼에 남아 있는 블록을 대상 버킷에 삽입해야 한다.
프로세서의 기본 버킷의 하위 어레이에 있는 모든 블록이 올바른 버킷에 있는 경우 다음 버킷이 기본 버킷으로 선택된다.프로세서가 모든 버킷을 기본 버킷으로 한 번 선택하면 프로세서가 완료된다.
정리하다
블록 순열 단계에서 전체 블록만 이동했기 때문에 일부 요소는 여전히 버킷 경계 주변에 잘못 배치될 수 있다.배열에 각 요소마다 충분한 공간이 있어야 하기 때문에 잘못 배치된 요소들은 마지막으로 오버플로 버퍼를 고려하여 왼쪽에서 오른쪽으로 빈 공간으로 이동할 수 있다.
참고 항목
참조
- ^ a b "Samplesort using the Standard Template Adaptive Parallel Library" (PDF) (Technical report). Texas A&M University.
- ^ Grama, Ananth; Karypis, George; Kumar, Vipin (2003). "9.5 Bucket and Sample Sort". Introduction to Parallel Computing (2nd ed.). ISBN 0-201-64865-2.
- ^ a b Frazer, W. D.; McKellar, A. C. (1970-07-01). "Samplesort: A Sampling Approach to Minimal Storage Tree Sorting". Journal of the ACM. 17 (3): 496–507. doi:10.1145/321592.321600.
- ^ a b Hill, Jonathan M. D.; McColl, Bill; Stefanescu, Dan C.; Goudreau, Mark W.; Lang, Kevin; Rao, Satish B.; Suel, Torsten; Tsantilas, Thanasis; Bisseling, Rob H. (1998). "BSPlib: The BSP Programming Library". Parallel Computing. 24 (14): 1947–1980. CiteSeerX 10.1.1.48.1862. doi:10.1016/S0167-8191(98)00093-3.
- ^ a b Sanders, Peter; Winkel, Sebastian (2004-09-14). Super Scalar Sample Sort. Algorithms - ESA 2004. Lecture Notes in Computer Science. Vol. 3221. pp. 784–796. CiteSeerX 10.1.1.68.9881. doi:10.1007/978-3-540-30140-0_69. ISBN 978-3-540-23025-0.
- ^ Gerbessiotis, Alexandros V.; Valiant, Leslie G. (1992). "Direct Bulk-Synchronous Parallel Algorithms". J. Parallel and Distributed Computing. 22: 22–251. CiteSeerX 10.1.1.51.9332.
- ^ Hightower, William L.; Prins, Jan F.; Reif, John H. (1992). Implementations of randomized sorting on large parallel machines (PDF). ACM Symp. on Parallel Algorithms and Architectures.
- ^ Blelloch, Guy E.; Leiserson, Charles E.; Maggs, Bruce M.; Plaxton, C. Gregory; Smith, Stephen J.; Zagha, Marco (1991). A Comparison of Sorting Algorithms for the Connection Machine CM-2. ACM Symp. on Parallel Algorithms and Architectures. CiteSeerX 10.1.1.131.1835.
- ^ Satish, Nadathur; Harris, Mark; Garland, Michael. Designing Efficient Sorting Algorithms for Manycore GPUs. Proc. IEEE Int'l Parallel and Distributed Processing Symp. CiteSeerX 10.1.1.190.9846.
- ^ Axtmann, Michael; Witt, Sascha; Ferizovic, Daniel; Sanders, Peter (2017). "In-Place Parallel Super Scalar Samplesort (IPSSSSo)". 25th Annual European Symposium on Algorithms (ESA 2017). 87 (Leibniz International Proceedings in Informatics (LIPIcs)): 9:1–9:14. doi:10.4230/LIPIcs.ESA.2017.9.
외부 링크
Frazer 및 McKellar의 샘플 및 파생 모델:
병렬 컴퓨터에서 사용할 수 있도록 조정: