Skip to content

Commit 6e72f8d

Browse files
committed
Add master assignment
1 parent 3a2abd2 commit 6e72f8d

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/neighbor_partitioner.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ NeighborPartitioner::NeighborPartitioner(std::string basefilename)
4646
}
4747
is_cores.assign(p, boost::dynamic_bitset<>(num_vertices));
4848
is_boundarys.assign(p, boost::dynamic_bitset<>(num_vertices));
49+
master.assign(num_vertices, -1);
4950
dis.param(std::uniform_int_distribution<vid_t>::param_type(0, num_vertices - 1));
5051

5152
degrees.resize(num_vertices);
@@ -118,6 +119,41 @@ void NeighborPartitioner::clean_samples()
118119
}
119120
}
120121

122+
void NeighborPartitioner::assign_master()
123+
{
124+
std::vector<int> count_master(p, 0);
125+
std::vector<vid_t> quota(p, num_vertices);
126+
long long sum = p * num_vertices;
127+
std::uniform_real_distribution<double> distribution(0.0, 1.0);
128+
std::vector<size_t> pos(p);
129+
rep (b, p)
130+
pos[b] = is_boundarys[b].find_first();
131+
vid_t count = 0;
132+
while (count < num_vertices) {
133+
long long r = distribution(gen) * sum;
134+
int k;
135+
for (k = 0; k < p; k++) {
136+
if (r < quota[k])
137+
break;
138+
r -= quota[k];
139+
}
140+
while (pos[k] < boost::dynamic_bitset<>::npos && master[pos[k]] != -1)
141+
pos[k] = is_boundarys[k].find_next(pos[k]);
142+
if (pos[k] < boost::dynamic_bitset<>::npos) {
143+
count++;
144+
master[pos[k]] = k;
145+
count_master[k]++;
146+
pos[k] = is_boundarys[k].find_next(pos[k]);
147+
quota[k]--;
148+
sum--;
149+
}
150+
}
151+
int max_masters =
152+
*std::max_element(count_master.begin(), count_master.end());
153+
LOG(INFO) << "master balance: "
154+
<< (double)max_masters / ((double)num_vertices / p);
155+
}
156+
121157
size_t NeighborPartitioner::count_mirrors()
122158
{
123159
size_t result = 0;
@@ -167,6 +203,7 @@ void NeighborPartitioner::split()
167203
read_timer.start();
168204
read_remaining();
169205
read_timer.stop();
206+
assign_master();
170207
LOG(INFO) << "expected edges in each partition: " << num_edges / p;
171208
rep (i, p)
172209
DLOG(INFO) << "edges in partition " << i << ": " << occupied[i];

src/neighbor_partitioner.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class NeighborPartitioner
3939
MinHeap<vid_t, vid_t> min_heap;
4040
std::vector<size_t> occupied;
4141
std::vector<vid_t> degrees;
42+
std::vector<int> master;
4243
std::vector<boost::dynamic_bitset<>> is_cores, is_boundarys;
4344

4445
std::random_device rd;
@@ -182,6 +183,7 @@ class NeighborPartitioner
182183
void read_more();
183184
void read_remaining();
184185
void clean_samples();
186+
void assign_master();
185187
size_t count_mirrors();
186188

187189
public:

0 commit comments

Comments
 (0)