2014-03-31 5 views
2

난 1에서 1000 사이의 임의의 숫자를 출력 할 수있는 병렬 알고리즘을 가지고 있습니다. 내 목표는 알고리즘의 N 번 실행에 대해 각 숫자가 선택된 횟수를 계산하는 것입니다. 예를 들어, 100 개의 스레드에서 N/100 실행 알고리즘을 수행하고 있으며 최종 결과는 각 숫자의 발생 인 1000 개의 int 배열입니다.카운트 총 동시 발생 수

이것을 지능적으로 병렬화하는 방법이 있습니까? 예를 들어, 하나의 전역 배열 만 사용하는 경우에는 필자가 쓰기를 원할 때마다 잠금을 설정해야합니다. 병렬 처리가없는 것처럼 알고리즘을 실행하게 만듭니다. 오타 손에서는 스레드 당 1000 개의 숫자 배열을 만들 수 없으며 단지 1 %를 채우고 끝에 병합합니다.

유용한 정보가 있습니까? 감사!

+0

건의 할 것입니다. 그러나 이러한 루틴을 구현하는 방법에 대한 온라인 설명은 많이 있으며, CUDA SDK에는 히스토그램 작성을위한 샘플 코드와 알고리즘을 설명하는 문서가 함께 제공됩니다. –

+0

고마워, 내가 볼게! – lezebulon

답변

3

이것은 히스토그램 작성 중입니다. 빨리 처리하려면 CUB 또는 Thrust과 같은 라이브러리를 사용하십시오.

빈 수가 적은 경우, 한 가지 방법은 각 스레드가 입력 세그먼트에 대해 자체 빈 집합을 처리하도록하는 것입니다. 그런 다음 각 bin을 병렬로 줄입니다. 당신이 당신의 쓰레기통의 저장 조직에 대한 영리한 경우, 병렬 감소는 매트릭스의 열 합계 금액 : 위의 예에서

   Bins: 
     1  2 3 4 ... 1000 
    T 1 
    h 2 
    r 3 
    e . 
    a . 
    d 100 

, 각 스레드는 입력의 세그먼트를 소요하고, 한 행에서 작동 부분합 행렬.

모든 스레드가 세그먼트로 끝나면 행렬의 열을 합계합니다. 이는 간단한 for-loop 커널로 매우 효율적이고 신속하게 수행 할 수 있습니다.

+0

오케이 그래서 기본적으로 제가 제안하는 두 번째 아이디어입니까? 그 경우 실행 당 1000 * 100 int가 필요합니다. 그렇죠? – lezebulon

+0

예. 결과는 1000 개의 int이지만 부분 합계 행렬은 100 * 1000 ints입니다 (100 개의 스레드 및 1000 개의 bin에 대해). 빈 수 (예 : 모든 양의 정수)가 큰 경우이 방법은 작동하지 않거나 수정해야합니다. –

-1

할 수있는 몇 가지 작업이 있습니다. 가능한 한 이식성을 유지하려면 각 색인에 대해 하나의 잠금을 가질 수 있습니다. 이 Windows 시스템에서 실행되는 경우

, 나는이 히스토그램의 문제이며, 몇 가지 생각을 필요로 않습니다 InterlockedIncrement