2014-11-11 4 views
0

값을 버킷에 균일하게 배포하는 가장 좋은 방법은? 값은 가우스 분포를 사용하여 생성되므로 대부분의 값은 중앙값에 가깝습니다.정규 분포를 균등하게 분배하는 가장 좋은 방법은? 값을 버킷에 넣으시겠습니까?

CUDA에서 버킷 정렬을 구현하고 있습니다. 대부분의 값은 중앙값 근처에서 생성되기 때문에 4-5 버킷에 삽입됩니다. 많은 수의 버킷을 만들 수 있으며 3-4 버킷 대신 모든 버킷의 값을 고르게 분배하고 싶습니다.

+0

히스토그램 작성과 비슷합니다. [Thrust] (https://github.com/thrust/thrust/blob/master/examples/histogram.cu)와 [CUB] (http://nvlabs.github.io/cub/structcub_1_1_device_histogram.html) 모두 히스토그램 작성을 제공합니다. 가능성. 내가 할 코드를 직접 작성하지 않는 것이 좋습니다. –

+0

위 내용은 좋은 조언입니다. 여기에 CUB의 히스토그램 작성 옵션을 살펴보십시오. http://nvlabs.github.io/cub/structcub_1_1_device_histogram.html – ebarr

+0

고마워요! 히스토그램 및 히스토그램 평준화가 확실한 선택이었습니다. –

답변

2

histogram을 찾고있는 것 같습니다.

성능을 찾으려면 두 개의 설명이 가리키는대로 CUB 또는 Thrust 라이브러리로 이동하십시오. 그렇지 않으면 많은 시간이 소요되지만 여전히 성능 수준을 달성하지 못합니다.

히스토그램을 구현하기로 결정했다면 가장 간단한 구현으로 시작할 것을 권장합니다. 2 단계 접근법. 첫 번째 단계에서는 각 버킷에 속하는 요소의 수를 계산하므로 올바른 배열 크기로 컨테이너 구조를 만들 수 있습니다. 두 번째 단계는 요소를 해당 구조체 배열에 복사하기 만하면됩니다.

여기에서 더 복잡한 버전으로 진화 할 수 있습니다. 예를 들어 prefix sum을 사용하여 큰 배열에서 버킷의 초기 위치를 계산할 수 있습니다.

응용 프로그램은 메모리 트래픽으로 제한되어 있으므로 (산술 워크로드가 전혀 없습니다) 가능한 한 지역 및 액세스 패턴을 향상 시키십시오.

물론 오픈 소스 코드를 통해 아이디어를 얻을 수 있습니다.

관련 문제