@@ -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+
121157size_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];
0 commit comments