38int main(
int argc,
char* argv[])
40 MPI::Init(argc, argv);
41 int nprocs = MPI::COMM_WORLD.Get_size();
42 int myrank = MPI::COMM_WORLD.Get_rank();
47 MPI::Datatype types[3] = {MPI::INT, MPI::DOUBLE, MPI::INT};
48 int lengths[3] = {1, 1, 1};
51 disp[0] = MPI::Get_address(&n.
id) - MPI::Get_address(&n);
52 disp[1] = MPI::Get_address(&n.
dist) - MPI::Get_address(&n);
53 disp[2] = MPI::Get_address(&n.
parent) - MPI::Get_address(&n);
62 MPI::Datatype types[1] = {MPI::DOUBLE};
66 disp[0] = MPI::Get_address(&ft.
cost) - MPI::Get_address(&ft);
67 Ft_MPI_datatype = MPI::Datatype::Create_struct(1, lengths, disp, types);
73 cout << endl <<
"Require 4 args..." << endl <<
74 "fileName startV startT testV" << endl;
79 char* fileName = argv[1];
80 stringstream sstr(argv[2]);
83 double startT = atof(argv[3]);
84 stringstream sstr2(argv[4]);
89 cout <<
"startV: " << startVert << endl;
91 MPI::COMM_WORLD.Barrier();
94 SpParMat<int, Ft, SpDCCols <int, Ft> > G;
95 G.ReadDistribute(fileName, 0);
97 int numVerts = G.getncol();
99 cout <<
"numVerts: " << numVerts << endl;
101 if (startVert > numVerts || startVert <= 0) {
102 cout <<
"Invalid start vertex id." << endl;
107 Node zero(
double(startT), -1);
109 time_t startTime, endTime;
112 startTime = time(NULL);
113 cout <<
"start computing" << endl;
117 bool finished =
false;
118 FullyDistVec<int, Node> result(G.getcommgrid(), G.getncol(),
Node());
119 FullyDistSpVec<int, Node> frontier(G.getcommgrid(), G.getncol());
121 frontier.SetElement(startVert - 1, zero);
122 frontier.setNumToInd();
127 frontier = EWiseApply<Node>(frontier, result, binaryOp, doOp,
false,
Node());
128 result.EWiseApply(frontier, binaryOp,
false,
Node());
130 for(iteration = 1; iteration < numVerts; iteration++) {
131 frontier = SpMV<SPSRing>(G, frontier);
132 frontier.setNumToInd();
133 frontier = EWiseApply<Node>(frontier, result, binaryOp, doOp,
false,
Node());
134 if (frontier.getnnz() == 0) {
138 result.EWiseApply(frontier, binaryOp,
false,
Node());
141 Node res = result[testVert - 1];
143 endTime = time(NULL);
144 elapsedTime = difftime(endTime, startTime);
146 cout <<
"finished" << endl;
150 cout <<
"negative loop" << endl;
152 cout <<
"number of iterations: " << iteration << endl;
153 cout <<
"running time: " << elapsedTime <<
"s" << endl;