2014-05-20 8 views
0

저는 CUDA에서 삼각형 목록을 입력으로 받아 그리드에서 복셀화하려고하는 알고리즘을 실행 중입니다. 출력은 삼각형으로 표시된 그리드 셀 목록이어야합니다. 물론이 목록은 입력 삼각형에 따라 크기가 달라집니다. 목록의 크기의 상한선을 알고 있습니다 (gridsize x gridsize x gridsize).CUDA : 벡터 목록 구현

문제는 가능한 모든 그리드 셀의 큰 테이블을 할당하고 그 테이블에서 true/false를 표시하는 것이 번거롭고 많은 메모리를 필요로한다는 것입니다. 또한 CUDA 원자 연산은 32/64 비트 값에서만 작동합니다. 이는 부울 플래그가 너무 과장 될 수 있습니다.

호스트에서 필자로 채워진 표 셀을 벡터에 추가 한 다음 벡터를 정렬하고 중복을 제거합니다.

가변 길이 목록을 저장하기위한 CUDA를위한 방법이나 알고리즘이 있습니까?

답변

2

프리미티브 (정렬, 고유)의 병렬 구현을 사용하는 것보다 순차 버전과 동일한 방법을 사용할 수 있습니다.

시작하는 가장 쉬운 방법은 Thrust를 사용하여 보는 것입니다의 weld vertices example 당신이 구문을 시작해야 개요는 다음과 같이 보일 것이다 :

  1. 사용을 삼각형의 목록을 변환 할 수있는 thrust::transform 알고리즘을 그리드 셀의 목록에
  2. 는 그리드 셀의 목록을 정렬 할
  3. thrust::sort 알고리즘 비교 연산자를 사용 그리드 셀의 순서를 정의하는 비교 연산자를 정의
  4. thrust::unique을 사용하여 중복 제거
+0

문제는 GPU 커널에서 스러스트 프리미티브를 사용할 수 없다는 것입니다. 그리고 삼각형이 그리드 셀에 속한 것인지 아닌지를 결정하는 수학적으로 중요한 부분은 커널에서 구현됩니다. –

+1

제 제안은'thrust :: transform'을 사용하여 분류 코드를 실행하는 것입니다. 즉, 결정을 펑터로 구현하고이를 '변환'으로 전달하는 것입니다. 다시 말해, 분류 코드는 삼각형을 입력으로 받아 그리드 셀 목록을 출력 한 다음 정렬을 수행 한 다음 중복을 제거합니다. – Tom