기능 | 예 | 시작하기 | 기고 | 라이센스 | 연락하다
STDGPU는 빠르고 신뢰할 수있는 데이터 관리를위한 일반적인 GPU 데이터 구조를 제공하는 오픈 소스 라이브러리입니다.
insert(begin, end) 과 같은 고수준 의 비공식 컨테이너 기능find(key) 와 같은 저수준 의 기본 컨테이너 기능은 맞춤형 커다 커널을 작성합니다.STDGPU는 또 다른 생태계를 제공하는 대신 가벼운 컨테이너 라이브러리 로 설계되었습니다. Strust, VEXCL, Arrayfire 또는 Boost.com과 같은 이전 라이브러리는 다양한 알고리즘의 빠르고 효율적인 구현에 중점을두고 연속적으로 저장된 데이터에서만 작동합니다. STDGPU는 직교 접근 방식을 따르며 빠르고 신뢰할 수있는 데이터 관리 에 중점을 두어 CPU와 마찬가지로보다 일반적이고 유연한 GPU 알고리즘을 신속하게 개발할 수 있습니다.
STDGPU는 다음과 같은 GPU 데이터 구조 및 컨테이너를 제공합니다.
atomic & atomic_ref원자 원시 유형 및 참조 | bitset공간 효율적인 비트 어레이 | deque동적 크기의 더블 엔드 큐 |
queue 및 stack컨테이너 어댑터 | unordered_map 및 unordered_set고유 키와 키 가치 쌍의 해시 컬렉션 | vector동적 크기 연속 어레이 |
또한 STDGPU는 algorithm , bit , contract , cstddef , execution , functional , iterator , limits , memory , mutex , numeric , ranges , type_traits , utility 에서 더 일반적으로 사용되는 도우미 기능을 제공합니다.
GPU에서 복잡한 작업을 안정적으로 수행하기 위해 STDGPU는 Thrust가 제공하는 알고리즘 과 기본 코드 (예 : 사용자 정의 CUDA 커널)를 통해 사용할 수있는 유연한 인터페이스를 제공합니다.
예를 들어, STDGPU는 확장 가능한 라이브 텔레프레 센스 시스템 인 SLAMCAST에서 광범위하게 사용하여 실시간, 대규모 3D 장면 재구성과 서버와 임의의 원격 클라이언트 간의 실시간 3D 데이터 스트리밍을 구현합니다.
아르 나이트 코드 . SLAMCAST의 맥락에서 간단한 작업은 다양한 업데이트 된 블록을 데이터 스트리밍을위한 중복없는 대기 블록 세트에 통합하는 것입니다.
# include < stdgpu/cstddef.h > // stdgpu::index_t
# include < stdgpu/iterator.h > // stdgpu::make_device
# include < stdgpu/unordered_set.cuh > // stdgpu::unordered_set
class stream_set
{
public:
void
add_blocks ( const short3* blocks,
const stdgpu:: index_t n)
{
set. insert ( stdgpu::make_device (blocks),
stdgpu::make_device (blocks + n));
}
// Further functions
private:
stdgpu::unordered_set<short3> set;
// Further members
};기본 코드 . 중복없는 업데이트 된 블록 또는 기타 알고리즘의 생성과 같은보다 복잡한 작업은 기본적으로 구현 될 수 있습니다.
# include < stdgpu/cstddef.h > // stdgpu::index_t
# include < stdgpu/unordered_map.cuh > // stdgpu::unordered_map
# include < stdgpu/unordered_set.cuh > // stdgpu::unordered_set
__global__ void
compute_update_set ( const short3* blocks,
const stdgpu:: index_t n,
const stdgpu::unordered_map<short3, voxel*> tsdf_block_map,
stdgpu::unordered_set<short3> mc_update_set)
{
// Global thread index
stdgpu:: index_t i = blockIdx. x * blockDim. x + threadIdx. x ;
if (i >= n) return ;
short3 b_i = blocks[i];
// Neighboring candidate blocks for the update
short3 mc_blocks[ 8 ]
= {
short3 (b_i. x - 0 , b_i. y - 0 , b_i. z - 0 ),
short3 (b_i. x - 1 , b_i. y - 0 , b_i. z - 0 ),
short3 (b_i. x - 0 , b_i. y - 1 , b_i. z - 0 ),
short3 (b_i. x - 0 , b_i. y - 0 , b_i. z - 1 ),
short3 (b_i. x - 1 , b_i. y - 1 , b_i. z - 0 ),
short3 (b_i. x - 1 , b_i. y - 0 , b_i. z - 1 ),
short3 (b_i. x - 0 , b_i. y - 1 , b_i. z - 1 ),
short3 (b_i. x - 1 , b_i. y - 1 , b_i. z - 1 ),
};
for (stdgpu:: index_t j = 0 ; j < 8 ; ++j)
{
// Only consider existing neighbors
if (tsdf_block_map. contains (mc_blocks[j]))
{
mc_update_set. insert (mc_blocks[j]);
}
}
} 더 많은 예제는 examples 디렉토리에서 찾을 수 있습니다.
STDGPU는 C ++ 17 컴파일러 와 최소 백엔드 종속성이 필요하며 CMAKE를 통해 프로젝트에 쉽게 구축 및 통합 할 수 있습니다.
STDGPU의 설계 및 API에 대한 포괄적 인 소개뿐만 아니라 더 많은 지침과 문서에서 찾을 수 있습니다.
기여 방법에 대한 자세한 정보는 문서의 기여 섹션을 참조하십시오.
Apache 2.0 라이센스에 따라 배포됩니다. 자세한 내용은 LICENSE 참조하십시오.
프로젝트 중 하나에서 STDGPU를 사용하는 경우 다음 간행물을 인용하십시오.
STDGPU : GPU의 효율적인 STL 유사 데이터 구조
@UNPUBLISHED { stotko2019stdgpu ,
author = { Stotko, P. } ,
title = { {stdgpu: Efficient STL-like Data Structures on the GPU} } ,
year = { 2019 } ,
month = aug,
note = { arXiv:1908.05936 } ,
url = { https://arxiv.org/abs/1908.05936 }
}슬램 캐스트 : 몰입 형 다중 클라이언트 라이브 텔레프레 센스를위한 대규모, 실시간 3D 재구성 및 스트리밍
@article { stotko2019slamcast ,
author = { Stotko, P. and Krumpen, S. and Hullin, M. B. and Weinmann, M. and Klein, R. } ,
title = { {SLAMCast: Large-Scale, Real-Time 3D Reconstruction and Streaming for Immersive Multi-Client Live Telepresence} } ,
journal = { IEEE Transactions on Visualization and Computer Graphics } ,
volume = { 25 } ,
number = { 5 } ,
pages = { 2102--2112 } ,
year = { 2019 } ,
month = may
}Patrick Stotko [email protected]