2011-12-05 6 views
5

CUDA/Thrust/CUDPP를 사용하고 있습니다. Stream Compaction에서 배열의 특정 항목은 유효하지 않은 것으로 표시되고 "제거됨"으로 표시됩니다.CUDA 스트림 압축 : 개념 이해

이제 "제거"가 실제로 여기서 의미하는 것은 무엇입니까? 원래 배열 A을 가정하고 두 요소가 무효 (어떤 조건에 의해 우리가 제공 할 수 있습니다) 경우 시스템이를 저장하는 GPU 메모리의 크기 4의 새로운 배열을 만들합니까 다음

  1. 길이 6가 유효한 요소를 사용하여 최종 결과를 얻으시겠습니까?

  2. 또는 실제로 유효하지 않은 요소를 메모리에서 제거하고 원래 배열을 축소합니다. 유효한 요소 만 유지하는 크기 4로 축소 되었습니까?

두 경우 모두 동적 메모리 할당이 후드에서 발생하고 있다는 뜻이 아닙니까? 그러나 CUDA 세계에서 동적 메모리 할당이 불가능하다는 소식을 들었습니다.

+2

메모리 할당의 크기가 변경되지 않고 첫 번째 4 개 요소가 유효하고 마지막 2 개는 정의되지 않은 또 다른 가능성이 있습니다. 그러나 실제로이 질문은 구현 문제에 관한 것이고, CUDPP 또는 추력이 똑같이 작동한다고 말하는 것은 누구입니까? – talonmies

+0

ArrayFire는 추력보다 더 좋고/더 쉬운 옵션이며 적어도 하나의 GPU 사용에 대해서는 무료입니다. http://accelereyes.com/arrayfire – arrayfire

답변

4

먼저, Compute Capability 2.0 이상의 장치에서 CUDA에서 동적 메모리 할당이 가능합니다. CUDA 런타임 라이브러리는 __device__ 함수에서 malloc/free 및 new/delete를 지원합니다. 하지만 그 대답은 사실과 밀접하지 않습니다.

일반적으로 충분히 큰 출력 배열이 제공되며 (입력 배열과 동일한 크기로 미리 할당 됨) 출력이 출력됩니다. 동적 할당은 필요하지 않지만 잠재적으로 스토리지 낭비가 있습니다. 이것은 CUDPP와 추진력이하는 일입니다. 대신에 유효한 요소의 수를 계산 한 다음 호스트 CPU에서 호출 된 cudaMalloc을 사용하여 동적으로 출력 GPU 메모리를 할당하는 방법도 있습니다.

+1

그것은 Thrust가하는 것과 다릅니다. Thrust의 압축 알고리즘 (예 :'''thrust :: copy_if''')은 일반적으로 출력 버퍼를 요청합니다. –

+0

감사합니다. 내 대답을 편집했습니다. 결과 iterator가 충분히 크지 않은 할당을 가리키면 어떻게 될까요? 자동 크기 조정이 있습니까? – harrism

+0

아니요; 반복기가 불충분 한 버퍼를 가리키면 그 동작은 정의되지 않습니다 (즉, 충돌합니다). –