-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathgraph.hpp
119 lines (104 loc) · 3.7 KB
/
graph.hpp
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
/*
* Copyright 2016 The George Washington University
* Written by Hang Liu
* Directed by Prof. Howie Huang
*
* https://www.seas.gwu.edu/~howie/
* Contact: [email protected]
*
*
* Please cite the following paper:
*
* Hang Liu and H. Howie Huang. 2015. Enterprise: breadth-first graph traversal on GPUs. In Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC '15). ACM, New York, NY, USA, Article 68 , 12 pages. DOI: http://dx.doi.org/10.1145/2807591.2807594
*
* This file is part of Enterprise.
*
* Enterprise is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Enterprise is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Enterprise. If not, see <http://www.gnu.org/licenses/>.
*/
#include "graph.h"
template<
typename file_vert_t, typename file_index_t, typename file_weight_t,
typename new_vert_t, typename new_index_t, typename new_weight_t>
graph<file_vert_t,file_index_t, file_weight_t,
new_vert_t,new_index_t,new_weight_t>
::graph(
const char *beg_file,
const char *csr_file,
const char *weight_file)
{
double tm=wtime();
FILE *file=NULL;
file_index_t ret;
vert_count=fsize(beg_file)/sizeof(file_index_t) - 1;
edge_count=fsize(csr_file)/sizeof(file_vert_t);
file=fopen(beg_file, "rb");
if(file!=NULL)
{
file_index_t *tmp_beg_pos = new file_index_t[vert_count+1];
ret=fread(tmp_beg_pos, sizeof(file_index_t),
vert_count+1, file);
assert(ret==vert_count+1);
fclose(file);
std::cout<<"Possible edge count: "<<tmp_beg_pos[vert_count]<<"\n";
//converting to new type when different
if(sizeof(file_index_t)!=sizeof(new_index_t))
{
beg_pos = new new_index_t[vert_count+1];
for(new_index_t i=0;i<vert_count+1;++i)
beg_pos[i]=(new_index_t)tmp_beg_pos[i];
delete[] tmp_beg_pos;
}else{beg_pos=(new_index_t*)tmp_beg_pos;}
}else std::cout<<"beg file cannot open\n";
file=fopen(csr_file, "rb");
if(file!=NULL)
{
file_vert_t *tmp_csr = NULL;
if(posix_memalign((void **)&tmp_csr,32,sizeof(file_vert_t)*edge_count))
perror("posix_memalign");
ret=fread(tmp_csr, sizeof(file_vert_t), edge_count, file);
assert(ret==edge_count);
fclose(file);
if(sizeof(file_vert_t)!=sizeof(new_vert_t))
{
if(posix_memalign((void **)&csr,32,sizeof(new_vert_t)*edge_count))
perror("posix_memalign");
for(new_index_t i=0;i<edge_count;++i)
csr[i]=(new_vert_t)tmp_csr[i];
delete[] tmp_csr;
}else csr=(new_vert_t*)tmp_csr;
}else std::cout<<"CSR file cannot open\n";
file=fopen(weight_file, "rb");
if(file!=NULL)
{
file_weight_t *tmp_weight = NULL;
if(posix_memalign((void **)&tmp_weight,32,
sizeof(file_weight_t)*edge_count))
perror("posix_memalign");
ret=fread(tmp_weight, sizeof(file_weight_t), edge_count, file);
assert(ret==edge_count);
fclose(file);
if(sizeof(file_weight_t)!=sizeof(new_weight_t))
{
if(posix_memalign((void **)&weight,32,
sizeof(new_weight_t)*edge_count))
perror("posix_memalign");
for(new_index_t i=0;i<edge_count;++i)
weight[i]=(new_weight_t)tmp_weight[i];
delete[] tmp_weight;
}else weight=(new_weight_t*)tmp_weight;
}
else std::cout<<"Weight file cannot open\n";
std::cout<<"Graph load (success): "<<vert_count<<" verts, "
<<edge_count<<" edges "<<wtime()-tm<<" second(s)\n";
}