使用Boost :: Graph随机访问顶点
Random access of Vertices using Boost::graph
我正在尝试使用OpenMP并行迭代Boost Graph的顶点。这似乎需要具有支持元素随机访问的迭代器(例如,itr[i]
获取i
TH元素)。但是,vertices(g)
返回(A vertex_iterator
)的迭代器似乎并不支持这一点。是否有一种有效,干净的方法可以实现这一目标?理想情况下,我只想要这样的循环标准:
for (int i = 0; i < num_vertices; i++) {
vertex v = itr[i];
// Compute on vertex
}
将与OpenMP合作。谢谢!
使用 adjacency_list<..., vecS, ...>
或 adjacency_matrix
可以通过具有积分型顶点描述符来实现这一目标。
稍微从开箱即用,请查看并行的增压图库(并行BGL)。它很有可能会做您想要的(以及更多),但更好?
微小的演示
活在coliru
样本输出(在我的系统上):
Generated 50000000 vertices in 1879ms
Using 8 threads.
Sum of volumes for 50000000 vertices in 94ms: 2.5603e+10
完整列表:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/random.hpp>
#include <chrono>
#include <iostream>
#include <omp.h>
#include <random>
static std::mt19937 prng { std::random_device{}() };
struct MyVertex {
uintmax_t volume = [] { static std::uniform_int_distribution<int> pick(0, 1024); return pick(prng); }();
};
using namespace boost;
using G = adjacency_list<vecS, vecS, directedS, MyVertex>;
G generate() {
using namespace std::chrono;
auto start = high_resolution_clock::now();
G g;
generate_random_graph(g, 50000000, 0, prng);
auto end = high_resolution_clock::now();
std::cerr << "Generated " << num_vertices(g) << " vertices " << "in " << duration_cast<milliseconds>(end-start).count() << "msn";
return g;
}
int main() {
auto const g = generate();
using namespace std::chrono;
auto start = high_resolution_clock::now();
double sum = 0;
#pragma omp parallel
{
#pragma omp single
std::cerr << "Using " << omp_get_num_threads() << " threads.n";
#pragma omp for reduction(+:sum)
for (G::vertex_descriptor u = 0; u < num_vertices(g); ++u) {
sum += g[vertex(u, g)].volume;
}
}
auto end = high_resolution_clock::now();
std::cerr << "Sum of volumes for " << num_vertices(g) << " vertices "
<< "in " << duration_cast<milliseconds>(end-start).count() << "ms: " << sum << "n";
}
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- BGL:无法访问捆绑的顶点属性
- 无法使用Assimp访问3D模型(.OBJ)的正确数量的顶点
- CGAL:加载.off文件后,如何访问顶点颜色
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 在 OpenGL 中,我可以访问我在顶点着色器中绘制的缓冲区吗?
- 使用Boost :: Graph随机访问顶点
- 尝试访问 CGAL 多面体顶点
- 访问网格的顶点
- 如何访问图中顶点边缘的数据
- C++ 提升图形库:构建在无向图形搜索中访问的顶点的向量
- 在boost中访问顶点时出现分割错误
- DFS访问器不遍历分离的顶点
- Boost DFS如何保存访问过的顶点
- 顶点缓冲区的直接状态访问
- 如何找到路径访问尽可能多的顶点