-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdist_graph.h
More file actions
122 lines (104 loc) · 3.9 KB
/
dist_graph.h
File metadata and controls
122 lines (104 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
//@HEADER
// *****************************************************************************
//
// XtraPuLP: Xtreme-Scale Graph Partitioning using Label Propagation
// Copyright (2016) Sandia Corporation
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact George M. Slota (gmslota@sandia.gov)
// Siva Rajamanickam (srajama@sandia.gov)
// Kamesh Madduri (madduri@cse.psu.edu)
//
// *****************************************************************************
//@HEADER
*/
#ifndef _DIST_GRAPH_H_
#define _DIST_GRAPH_H_
#include <stdint.h>
//#include "include/global.h"
#include "fast_map.h"
namespace pulp{
extern int procid, nprocs;
extern bool verbose, debug, verify;
struct dist_graph_t;
struct mpi_data_t;
struct queue_data_t;
struct graph_gen_data_t {
uint64_t n;
uint64_t m;
uint64_t n_local;
uint64_t n_offset;
uint64_t m_local_read;
uint64_t m_local_edges;
uint64_t *gen_edges;
};
int create_graph(graph_gen_data_t *ggi, dist_graph_t *g);
int create_graph_serial(graph_gen_data_t *ggi, dist_graph_t *g);
int create_graph(dist_graph_t* g,
uint64_t n_global, uint64_t m_global,
uint64_t n_local, uint64_t m_local,
uint64_t* local_offsets, uint64_t* local_adjs, uint64_t* global_ids,
int32_t* vertex_weights, int32_t* edge_weights);
int create_graph_serial(dist_graph_t* g,
uint64_t n_global, uint64_t m_global,
uint64_t n_local, uint64_t m_local,
uint64_t* local_offsets, uint64_t* local_adjs,
int32_t* vertex_weights, int32_t* edge_weights);
int clear_graph(dist_graph_t *g);
int relabel_edges(dist_graph_t *g);
int relabel_edges(dist_graph_t* g, uint64_t* verts_per_rank);
int get_max_degree_vert(dist_graph_t *g);
int get_ghost_degrees(dist_graph_t* g);
int get_ghost_degrees(dist_graph_t* g, mpi_data_t* comm, queue_data_t* q);
inline int32_t highest_less_than(uint64_t* prefix_sums, uint64_t val)
{
bool found = false;
int32_t rank = 0;
int32_t bound_low = 0;
int32_t bound_high = nprocs;
while (!found)
{
rank = (bound_high + bound_low) / 2;
if (prefix_sums[rank] <= val && prefix_sums[rank+1] > val)
{
found = true;
}
else if (prefix_sums[rank] < val)
bound_low = rank;
else if (prefix_sums[rank] > val)
bound_high = rank;
}
return rank;
}
}
#endif