| Примеры | Шаблон проекта | Документация | Действия GitHub |
|---|
Gunrock 1 -это библиотека CUDA для графической обработки, разработанной специально для GPU. Он использует высокоуровневую , объемную синхронную/асинхронную , ориентированную на данные абстракция, ориентированная на операции на границ вершины или краев. Gunrock достигает баланса между производительностью и выразительностью путем объединения высокопроизводительных примитивов GPU и стратегий оптимизации, особенно в области мелкозернистого балансировки нагрузки, с моделью программирования высокого уровня, которая позволяет программистам быстро разрабатывать примитивы на новом графике, которые масштабируются от одного до многих графических процессоров на узле с небольшим размером кода и минимальными знаниями по программированию GPU.
| Ветвь | Цель | Версия | Статус |
|---|---|---|---|
main | Филиал по умолчанию, переносимый из gunrock/essentials , служит официальным филиалом. | 2.xx | Активный |
develop | Особенность разработки, переносимый из gunrock/essentials . | 2.xx | Активный |
master | Предыдущий релиз ветви для интерфейса gunrock/gunrock Version 1.xx сохраняет всю историю совершения. | 1.xx | Устарел |
dev | Предыдущий филиал для разработки для gunrock/gunrock . Все изменения теперь объединены в master . | 1.xx | Устарел |
Прежде чем строить Gunrock, убедитесь, что в вашей системе установлен Cuda Toolkit 2 . Другие внешние зависимости, такие как NVIDIA/thrust , NVIDIA/cub и т. Д., Получаются автоматически с использованием cmake .
git clone https://github.com/gunrock/gunrock.git
cd gunrock
mkdir build && cd build
cmake ..
make sssp # or for all algorithms, use: make -j$(nproc)
bin/sssp ../datasets/chesapeake/chesapeake.mtx Для получения подробного объяснения, см. Полную документацию. В следующем примере показаны простые API с использованием ориентированной на данные Gunrock, объемный синхронный программирование, мы реализуем поиск по борьбе с графическими процессорами. Этот пример пропускает фазу настройки создания структуры problem_t и enactor_t и прыгает прямо в фактический алгоритм.
Сначала мы подготовим нашу границу с начальной вершиной исходной вершины, чтобы начать обход BFS на основе Push. Простая f->push_back(source) помещает начальную вершину, которую мы будем использовать для нашей первой итерации.
void prepare_frontier ( frontier_t * f,
gcuda:: multi_context_t & context) override {
auto P = this -> get_problem ();
f-> push_back (P-> param . single_source );
}Затем мы начинаем нашу итеративную петлю, которая итерация не будет выполнена до тех пор, пока не будет выполнено условие сходимости. Если условия не указано, петля сходится, когда граница пуста.
void loop (gcuda:: multi_context_t & context) override {
auto E = this -> get_enactor (); // Pointer to enactor interface.
auto P = this -> get_problem (); // Pointer to problem (data) interface.
auto G = P-> get_graph (); // Graph that we are processing.
auto single_source = P-> param . single_source ; // Initial source node.
auto distances = P-> result . distances ; // Distances array for BFS.
auto visited = P-> visited . data (). get (); // Visited map.
auto iteration = this -> iteration ; // Iteration we are on.
// Following lambda expression is applied on every source,
// neighbor, edge, weight tuple during the traversal.
// Our intent here is to find and update the minimum distance when found.
// And return which neighbor goes in the output frontier after traversal.
auto search = [=] __host__ __device__ (
vertex_t const & source, // ... source
vertex_t const & neighbor, // neighbor
edge_t const & edge, // edge
weight_t const & weight // weight (tuple).
) -> bool {
auto old_distance =
math::atomic::min (&distances[neighbor], iteration + 1 );
return (iteration + 1 < old_distance);
};
// Execute advance operator on the search lambda expression.
// Uses load_balance_t::block_mapped algorithm (try others for perf. tuning.)
operators::advance::execute<operators:: load_balance_t ::block_mapped>(
G, E, search, context);
}Включите/Gunrock/Algorithms/bfs.hxx
Спасибо за ссылку на нашу работу.
@article { Wang:2017:GGG ,
author = { Yangzihao Wang and Yuechao Pan and Andrew Davidson
and Yuduo Wu and Carl Yang and Leyuan Wang and
Muhammad Osama and Chenshan Yuan and Weitang Liu and
Andy T. Riffel and John D. Owens } ,
title = { {G}unrock: {GPU} Graph Analytics } ,
journal = { ACM Transactions on Parallel Computing } ,
year = 2017 ,
volume = 4 ,
number = 1 ,
month = aug,
pages = { 3:1--3:49 } ,
doi = { 10.1145/3108140 } ,
ee = { http://arxiv.org/abs/1701.01170 } ,
acmauthorize = { https://dl.acm.org/doi/10.1145/3108140?cid=81100458295 } ,
url = { http://escholarship.org/uc/item/9gj6r1dj } ,
code = { https://github.com/gunrock/gunrock } ,
ucdcite = { a115 } ,
} @InProceedings { Osama:2022:EOP ,
author = { Muhammad Osama and Serban D. Porumbescu and John D. Owens } ,
title = { Essentials of Parallel Graph Analytics } ,
booktitle = { Proceedings of the Workshop on Graphs,
Architectures, Programming, and Learning } ,
year = 2022 ,
series = { GrAPL 2022 } ,
month = may,
pages = { 314--317 } ,
doi = { 10.1109/IPDPSW55747.2022.00061 } ,
url = { https://escholarship.org/uc/item/2p19z28q } ,
}Gunrock - авторское право, регенты Калифорнийского университета. Библиотека, примеры и весь исходный код выпускаются в Apache 2.0.
Этот репозиторий был перенесен с https://github.com/gunrock/essentials, и предыдущая история сохраняется с тегами и под master филиалом. Узнайте больше о Gunrock и Essentials в нашей статье Vision Paper: Основы анализа параллельных графов. ↩
Рекомендуется CUDA V11.5.1 или выше из -за поддержки упорядоченных потоковых распределителей памяти. ↩