2013-09-01 2 views
5

CUDA의 내 프로젝트에서 고성능 멀티 스캔/다중 접두사 합계 (한 커널 실행의 여러 행) 기능을 찾고 있습니다.CUDA의 고성능 접두어 합계/스캔 기능, cuDPP 라이브러리 대체 기능

나는 추력 라이브러리에서 시도했지만 너무 느립니다. 또한 nvcc 디버그 플래그 (-g -G)를 사용하여 컴파일 한 후 충돌을 추력합니다.

추력으로 실패한 후 나는 CUDA 툴킷의 일부였던 cuDPP 라이브러리에 집중했다. cuDPP 성능은 정말 좋지만 라이브러리가 최신 cuda 5.5로 업데이트되지 않았으며 메모리 검사기로 디버깅하는 동안 cudppMultiScan() 함수에 전역 메모리 위반 문제가 있습니다. (cuda 5.5, nsight 3.1, visual studio 2010, gtx 260 cc 1.3)

아무도이 두 라이브러리 대신 무엇을 사용해야하는지 잘 모릅니 까? 예를 들어 알고리즘의 전문화 (INT처럼 또는 float) 기본 유형의 공유 메모리를 사용할 수 있지만 :

R.

+0

AccelerEyes에서 작업중인 [ArrayFire] (http://accelereyes.com/arrayfire)를 보았습니까? – arrayfire

+0

아니요, 전에는 보지 못했지만 꽤 재미있을 것 같습니다. 감사! :) 성능은 어떨까요? 더 많은 생산성 또는 성능 중심의 라이브러리입니까? – user1946472

+0

추력을 사용하여 행렬을 스캔하려면 'inclusive_scan'을 반복해서 호출하지 마십시오. 각 행에 인덱스를 할당하고'inclusive_scan_by_key'를 사용하십시오. 이 [예제] (https://github.com/thrust/thrust/blob/master/examples/sum_rows.cu)를 적용 할 수 있습니다. –

답변

2

이 라이브러리, 특히 추력 가능하고 최적화 한 일반적인 되려고 노력하는 것은 종종 전문성을 필요로 일반 버전은 할 수 없습니다. 특정 상황에 대한 전문화가 누락되었습니다!

잘 테스트 된 제네릭 라이브러리를 가능한 많이 사용하는 것이 좋지만 일부 성능 중요 섹션의 경우 사용자의 구현이 고려해야 할 옵션입니다.

상황에 따라 서로 다른 행에 대해 많은 스캔을 병렬로 수행해야합니다. 좋은 구현은 다른 행에 대해 별도로 스캔을 실행하지 않습니다. 모든 행의 모든 ​​요소에 대해 동일한 커널 호출이 동시에 실행됩니다. 색인에 따라 스레드는 처리중인 행을 알 수 있으며 행에서 모든 데이터를 무시합니다.

이러한 특수화에는 행을 혼합하지 못하게하는 흡수 값을 반환하는 펑터가 필요합니다. 여전히주의 깊은 구현이 더 빠를 것입니다.

2

자신의 접두사 검색을 작성하려면, 당신은 CUDA SDK의

  1. 스캔 예를 참조 할 수 있습니다;
  2. N. 윌트 (N. Wilt)의 제 13 장 "The CUDA Handbook";
  3. S. Cook의 6 장, "CUDA 프로그래밍, GPU를 사용한 병렬 컴퓨팅에 대한 개발자 안내서";
  4. Parallel Prefix Sum (Scan) with CUDA.

내가 그것을 모르고 있지만이 효과적으로 카드 작동합니다, 당신은 (a.lasram에 의해 제안) 여러 번에 동일한 커널을 실행하거나 CUDA 스트림에 의해 cuncurrency을 달성하기 위해 시도 할 수 있습니다 멀티 접두사 합을 수행하려면 .

+0

스트림을 사용하는 것이 좋습니다. 그러나 각 스레드가 선택된 행에서 계산을 "클램프"하는 하나의 커널을 시작하는 것이 더 좋습니다. –

+0

나는 1424 개의 부동 소수점 행 231 개를 가지고 있으므로 별도의 커널에서 각 행을 실행하면 너무 큰 시간을줍니다 오버 헤드로 인한 오버 헤드. cuDPP는 내 컴퓨터 (gtx260)에서 약 0.11 ms로이 작업을 수행합니다. 이는 저에게 훌륭한 결과입니다! 성능면에서 cuDPP lib는 완벽합니다. 지금은 @accelereyes가 제안한 arrayFire 라이브러리를 사용해 보겠습니다. 답변 주셔서 감사합니다. – user1946472