66 double*& pageranks,
uint32_t num_iter)
68 if (
debug) { printf(
"Task %d run_pagerank() start\n",
procid); }
71 MPI_Barrier(MPI_COMM_WORLD);
72 elt = omp_get_wtime();
75 double* pageranks_next = (
double*)malloc(g->
n_total*
sizeof(
double));
76 double sum_noouts = 0.0;
77 double sum_noouts_next = 0.0;
83#pragma omp parallel default(shared)
88#pragma omp for reduction(+:sum_noouts_next)
91 pageranks[i] = (1.0 / (double)g->
n);
97 pageranks[i] /= (double)g->
n;
98 sum_noouts_next += pageranks[i];
103 pageranks[i] = (1.0 / (
double)g->
n) / (
double)g->
n;
106 pageranks_next[i] = pageranks[i];
108#pragma omp for schedule(guided) nowait
127#pragma omp for schedule(guided) nowait
140 MPI_Allreduce(&sum_noouts_next, &sum_noouts, 1,
141 MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
142 sum_noouts_next = 0.0;
160 for (
uint32_t iter = 0; iter < num_iter; ++iter)
163 printf(
"Task %d Iter %u run_pagerank() sink contribution sum %e\n",
procid, iter, sum_noouts);
166#pragma omp for schedule(guided) reduction(+:sum_noouts_next) nowait
170 double vert_pagerank = sum_noouts;
175 vert_pagerank += pageranks[ins[j]];
185 vert_pagerank /= (double)g->
n;
186 sum_noouts_next += vert_pagerank;
189 pageranks_next[vert_index] = vert_pagerank;
200 MPI_Allreduce(&sum_noouts_next, &sum_noouts, 1,
201 MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
202 sum_noouts_next = 0.0;
211 double* temp = pageranks;
212 pageranks = pageranks_next;
213 pageranks_next = temp;
221 free(pageranks_next);
224 elt = omp_get_wtime() - elt;
225 printf(
"Task %d, run_pagerank() time %9.6f (s)\n",
procid, elt);
227 if (
debug) { printf(
"Task %d run_pagerank() success\n",
procid); }
235 if (
debug) printf(
"Task %d pageranks to %s\n",
procid, output_file);
237 double* global_pageranks = (
double*)malloc(g->
n*
sizeof(
double));
239#pragma omp parallel for
241 global_pageranks[i] = -1.0;
243#pragma omp parallel for
251 global_pageranks[g->
local_unmap[i]] = pageranks[i] * (double)g->
n;
255 MPI_Reduce(MPI_IN_PLACE, global_pageranks, (
int32_t)g->
n,
256 MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
258 MPI_Reduce(global_pageranks, global_pageranks, (
int32_t)g->
n,
259 MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
265 if (global_pageranks[i] == -1.0)
267 printf(
"Pagerank error: %lu not assigned\n", i);
268 global_pageranks[i] = 0.0;
271 std::ofstream outfile;
272 outfile.open(output_file);
275 outfile << global_pageranks[i] << std::endl;
280 free(global_pageranks);
282 if (
debug) printf(
"Task %d done writing pageranks\n",
procid);
290 if (
debug) { printf(
"Task %d pagerank_verify() start\n",
procid); }
292 double* global_pageranks = (
double*)malloc(g->
n*
sizeof(
double));
294#pragma omp parallel for
296 global_pageranks[i] = -1.0;
298#pragma omp parallel for
305 global_pageranks[g->
local_unmap[i]] = pageranks[i] * (double)g->
n;
309 MPI_Reduce(MPI_IN_PLACE, global_pageranks, (
int32_t)g->
n,
310 MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
312 MPI_Reduce(global_pageranks, global_pageranks, (
int32_t)g->
n,
313 MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
319 pr_sum += global_pageranks[i];
321 printf(
"PageRanks sum (should be 1.0): %9.6lf\n", pr_sum);
324 free(global_pageranks);
326 if (
debug) { printf(
"Task %d pagerank_verify() success\n",
procid); }
332 uint32_t num_iter,
char* output_file)
334 if (
debug) { printf(
"Task %d pagerank_dist() start\n",
procid); }
336 MPI_Barrier(MPI_COMM_WORLD);
337 double elt = omp_get_wtime();
339 double* pageranks = (
double*)malloc(g->
n_total*
sizeof(
double));
342 MPI_Barrier(MPI_COMM_WORLD);
343 elt = omp_get_wtime() - elt;
344 if (
procid == 0) printf(
"PageRank time %9.6f (s)\n", elt);
356 if (
debug) printf(
"Task %d pagerank_dist() success\n",
procid);