2013-03-10 4 views
4

각 스레드 블록 (1 차원)이 여러 다른 작업으로 공유 메모리 내부의 배열에서 스캔을 실행해야하는 문제가 있습니다. 배열에는 최대 1024 개의 요소가 있습니다.CUDA의 공유 메모리에서 병렬 스캔

이러한 유형의 작업을 지원하는 라이브러리가 있습니까?

나는 Thrust와 CudPP를 확인했지만 데이터가 처음에는 전역 메모리에있을 때만 작동합니다. 내가 원하는 것은 아니 었습니다. 거의 작업을하지 않고 새로운 커널을 시작하고 싶지 않기 때문입니다. 그것은 매우 큰 오버 헤드를 가지고 있기 때문에 전역 메모리에 데이터를 저장합니다.

이러한 유형의 작업을 지원하는 공용 라이브러리가없는 경우이 작업을 한 번만 작성하고 몇 가지 다른 문제에서 사용하려는 경우 무엇을 제안합니까?

첫 번째 아이디어는 스캔 작업을 실행하는 간단한 장치 기능을 작성하는 것이지만 공유 메모리에 액세스하고 커널 기능이 아닌 장치 기능에서 __syncthreads() 작업을 수행 할 수 있습니까? 다른 생각은 전체 함수를 매크로로 작성한 후 전 처리기가 코드를 커널 코드로 복사하지만 복잡한 매크로를 작성하는 것이 매크로를 사용하는 최선의 방법이 아니기 때문에 작동합니다.

추 신 : 다중 프로세서 2.1 버전을 스트리밍 했으므로 다른 커널에서 새 커널을 시작할 수 없습니다.

답변

5

이 유형의 작업을 지원하는 라이브러리가 있습니까?

이러한 유형의 작업을 지원하는 공용 라이브러리가없는 경우이 작업을 한 번만 작성하고 몇 가지 다른 문제에서 사용하려는 경우 무엇을 제안합니까?

CUDA UnBound를 나타내는 CUB라는 라이브러리가 있습니다. 당신은 그것을 here 찾을 수 있습니다. 그것은 스캔 기능을 제공합니다.
비슷한 것을 쓰고 싶다면 CUB이 도움이 될 것입니다.

내 첫 번째 아이디어는 스캔 작업을 실행하는 간단한 호스트 기능을 작성하는 것이지만 공유 메모리에 액세스하고 커널 기능이 아닌 장치 기능에서 __syncthreads() 작업을 수행 할 수 있습니까?

"호스트가 스캔 조작을 실행하는 기능"의 의미가 확실하지 않습니다.
호스트 코드에서 할 수있는 유일한 일은 커널과 메모리 복사본을 시작하는 것입니다. 해당 공유 메모리를 소유 한 블록에서 장치 기능을 호출하지 않으면 대답은 아니오입니다.
공유 메모리는 블록 당 할당되며 블록 내부에서만 액세스 할 수 있습니다.

+0

고마워요. 대답은 큐브가 정확히 내가 좋아하는 것 같습니다. 필자는 호스트 기능이 아닌 장치 기능을 작성하려고했습니다. 나는 그것을 그리워하고있다. – SqrtPi

관련 문제