-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpr_pull.cpp
103 lines (81 loc) · 3.37 KB
/
pr_pull.cpp
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
#include <CL/sycl.hpp>
#include <iostream>
#include <fstream>
#define DEBUG 0
#include "../graph.h"
using namespace sycl;
int main(int argc, char **argv)
{
std::chrono::steady_clock::time_point tic_0 = std::chrono::steady_clock::now();
std::ofstream logfile;
std::string name = argv[1];
int NUM_THREADS = atoi(argv[2]);
std::string NUM_THREADS_STR = std::to_string(NUM_THREADS);
logfile.open("pagerank/output/" + name + "_pr_pull_time_" + NUM_THREADS_STR + ".txt");
logfile << "Processing " << name << std::endl;
default_selector d_selector;
queue Q(d_selector);
logfile << "Selected device: " << Q.get_device().get_info<info::device::name>() << std::endl;
logfile << "Number of parallel work items: " << NUM_THREADS << std::endl;
std::chrono::steady_clock::time_point tic = std::chrono::steady_clock::now();
graph *g = malloc_shared<graph>(1, Q);
g->load_graph(name, Q);
std::chrono::steady_clock::time_point toc = std::chrono::steady_clock::now();
logfile << "Time to load data from files: " << std::chrono::duration_cast<std::chrono::microseconds>(toc - tic).count() << "[µs]" << std::endl;
float beta = 0.001;
int maxIter = 100;
float delta = 0.85;
int N = g->get_num_nodes();
int stride = NUM_THREADS;
std::vector<float> pagerank(N);
float *dev_pagerank = malloc_device<float>(N, Q);
initialize(dev_pagerank, float(1 / N), NUM_THREADS, N, Q);
float *dev_pagerank_i = malloc_device<float>(N, Q);
initialize(dev_pagerank_i, float(1 / N), NUM_THREADS, N, Q);
tic = std::chrono::steady_clock::now();
logfile << "Starting Pagerank..." << std::endl;
float *diff = malloc_shared<float>(1, Q);
int iterCount = 0;
do
{
forall(N, NUM_THREADS)
{
float sum = 0;
// pull
int u_itr;
for_parents(u, u_itr)
{
int nbr = get_parent(u_itr);
sum = sum + dev_pagerank[nbr] / (get_num_neighbours(nbr));
}
float val = (1 - delta) / N + delta * sum;
ATOMIC_FLOAT atomic_data(*diff);
atomic_data += (float)val - dev_pagerank[u];
dev_pagerank_i[u] = val;
}
end;
forall(N, NUM_THREADS)
{
dev_pagerank[u] = dev_pagerank_i[u];
}
end;
iterCount += 1;
} while ((*diff > beta) && (iterCount < maxIter));
toc = std::chrono::steady_clock::now();
logfile << "Time to run Pagerank: " << std::chrono::duration_cast<std::chrono::microseconds>(toc - tic).count() << "[µs]" << std::endl;
tic = std::chrono::steady_clock::now();
std::ofstream resultfile;
int num_covered = 0;
memcpy(&pagerank[0], dev_pagerank, N, Q);
resultfile.open("pagerank/output/" + name + "_pr_pull_result_" + NUM_THREADS_STR + ".txt");
for (int i = 0; i < N; i++)
{
resultfile << i << " " << pagerank[i] << std::endl;
}
resultfile.close();
toc = std::chrono::steady_clock::now();
logfile << "Time to write data to file: " << std::chrono::duration_cast<std::chrono::microseconds>(toc - tic).count() << "[µs]" << std::endl;
std::chrono::steady_clock::time_point toc_0 = std::chrono::steady_clock::now();
logfile << "Total time taken: " << std::chrono::duration_cast<std::chrono::microseconds>(toc_0 - tic_0).count() << "[µs]" << std::endl;
return 0;
}