Особенности | Примеры | Начало работы | Вклад | Лицензия | Контакт
STDGPU-это библиотека с открытым исходным кодом, предоставляющая общие структуры данных GPU для быстрого и надежного управления данными.
insert(begin, end) , для написания общего кода C ++find(key) , чтобы написать пользовательские ядра CUDA и т. Д.Вместо того, чтобы предоставлять еще одну экосистему, STDGPU предназначен для легкой библиотеки контейнеров . Предыдущие библиотеки, такие как тяга, VEXCL, Arrayfire или Boost.com, сосредоточены на быстрой и эффективной реализации различных алгоритмов и работают только на смежных хранимых данных. STDGPU следует ортогональному подходу и фокусируется на быстром и надежном управлении данными , чтобы обеспечить быстрое развитие более общих и гибких алгоритмов графических процессоров, как и их аналоги CPU.
По сути, 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 .
Чтобы надежно выполнить сложные задачи на графическом процессоре, STDGPU предлагает гибкие интерфейсы, которые можно использовать в обоих агностическом коде , например, через алгоритмы, предоставленные THRUST, а также в собственном коде , например, в пользовательских ядрах CUDA.
Например, STDGPU широко используется в Slamcast, масштабируемой системе Live Telepresence, для реализации, крупномасштабной реконструкции 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
};Нативный код . Более сложные операции, такие как создание бездупликационного набора обновленных блоков или других алгоритмов, могут быть реализованы изначально, например, в пользовательских ядрах CUDA с включенным бэкэнд CUDA от StdGPU:
# 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 :
В документации можно найти больше руководящих принципов, а также всеобъемлющее введение в дизайн и API Stdgpu.
Для получения подробной информации о том, как внести свой вклад, см. Раздел «Внесение в документацию».
Распределено по лицензии Apache 2.0. Смотрите LICENSE для получения дополнительной информации.
Если вы используете STDGPU в одном из своих проектов, пожалуйста, укажите следующие публикации:
STDGPU: эффективные структуры данных, подобные 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 }
}Slamcast: крупномасштабная, 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
}Патрик Стотко - [email protected]