2012-10-23 2 views
0

짧은 버전 : CUDA에서 효율적인 필터 작업을 어떻게 구현합니까?큐를 필터링하는 CUDA

긴 버전 : 큐 필터링 의미를 따르는 CUDA 코드가 있습니다. 대기열에 5 백만 개가 넘는 초기 요소가 있으며 코드는 "비싼"단계별 계산을 사용하여 필터합니다. 최종 결과는 ~ 1000 개의 요소를 유지해야하며, 각 단계에서 제거 된 요소의 수는 지수 감소 곡선 (즉, 첫 번째 단계는 많이 제거하고 마지막 단계는 거의 제거하지 않습니다)을 따릅니다.

GPU에서 각 요소는 (스레드 블록 단위로) 병렬로 처리되기 때문에 단순히 "모든 요소에 대한 모든 단계"를 실행하는 것은 상당히 낭비입니다. 주어진 단계에서 하나의 요소가 유지 될 수 있고 다른 모든 요소는 이미 제거 될 수 있지만 이미 "제거 할 준비가 된"요소에 대해서도 나머지 모든 단계에서 계산이 계속됩니다.

보다 효율적인 방법은 입력 목록을 읽고 결과를 중간 출력 목록에 저장하여 각 단계를 개별적으로 실행하는 것입니다. 그런 다음 탁구 스키마에서 실행되도록하십시오. 이렇게하면 중요한 전역 메모리 읽기 쓰기가 생성되며 출력 목록에 동시 쓰기를 동기화하는 atomicInc에 압력을가합니다.

단계별 필터링을 어떻게 제안 하시겠습니까?

답변 해 주셔서 감사합니다.

답변

3

compact 또는 remove_if을 사용하시는 것이 좋습니다. CUDPP 라이브러리 또는 thrust 라이브러리를 사용할 수 있습니다. 모든 단계에 걸쳐 모든 단계를 계산하지 않으면 각 단계 이후에 전역 메모리에 쓰는 것을 피할 수 없습니다.

는 간단한 의사 코드입니다 :

  1. 초기화 메모리 등
  2. foreach는 무대 할
  3. 실행 모든 요소에 대한 필터링 모든 요소에 대한
  4. 사용 소형/remove_if
  5. 재 작성 요소 또는 수행 다른 것 (사용 된 라이브러리에 따라 다름)
  6. 마지막 단계가 다른 경우 다른 방법으로 이동 4
+1

또한'thrust :: copy_if'를 살펴보십시오. 나는'remove_if '가 당신의 경우에 더 비쌀 수도있는 정렬이라고 생각합니다. 또한 단일 GPU에서 무료 인 ArrayFire 라이브러리를 살펴보십시오. 자체 알고리즘을 구현하려면 [CUDA의 병렬 최적화 최적화] (http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/reduction/doc/reduction.pdf)를 읽어보십시오. . –