特徴|例|開始|寄稿|ライセンス|接触
STDGPUは、高速で信頼できるデータ管理のための一般的なGPUデータ構造を提供するオープンソースライブラリです。
insert(begin, end)などの高レベルの不可知論のコンテナ機能find(key) 、Cuda Cuda Kernelsなどを書くなどの低レベルのネイティブコンテナ関数。さらに別のエコシステムを提供する代わりに、STDGPUは軽量コンテナライブラリになるように設計されています。スラスト、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は、たとえば、スラストによって提供されるアルゴリズムやネイティブコードなど、カスタムCuda Kernelsの両方で使用できる柔軟なインターフェイスを提供します。
たとえば、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
};ネイティブコード。更新されたブロックの複製セットやその他のアルゴリズムの作成などのより複雑な操作は、STDGPUのCUDAバックエンドを有効にしたカスタムCudaカーネルなどのネイティブに実装できます。
# 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 Directoryに記載されています。
STDGPUには、C ++ 17コンパイラと最小限のバックエンド依存関係が必要であり、 Cmakeを介してプロジェクトに簡単に統合できます。
より多くのガイドラインと、STDGPUの設計とAPIの包括的な紹介については、ドキュメントにあります。
貢献方法の詳細については、ドキュメントの貢献セクションを参照してください。
Apache 2.0ライセンスの下で配布。詳細については、 LICENSE参照してください。
プロジェクトの1つで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] -bonn.de