-
Notifications
You must be signed in to change notification settings - Fork 0
/
parallel.cpp
87 lines (73 loc) · 2.4 KB
/
parallel.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
#include <iostream>
#include <fstream>
#include <random>
#include <string>
#include <sstream>
#include <vector>
#include <tuple>
#include <math.h>
#include <map>
#include <algorithm>
#include <future>
#include <chrono>
#include <thread>
#include <iomanip>
#include <float.h>
#include "utils.h"
typedef std::pair<double, int> pi;
typedef std::map<int, std::vector<pi>> KnnType;
typedef std::vector<std::pair<double,double>> pointsType;
void printKnn(KnnType& knn){
for (auto const& x : knn){
std::cout << x.first << ": " << std::endl;
auto neighbours = x.second;
for(int i = 0; i < neighbours.size(); i++){
std::cout << neighbours[i].second << " :" << neighbours[i].first << ", ";
}
std::cout << std::endl;
}
}
int main(int argc, char **argv) {
if(argc != 5){
std::cout << "Wrong input format!" << std::endl;
std::cout << "Usage: " << argv[0] << " K nw inputFile outputFile" << std::endl;
exit(-1);
}
int k = std::atoi(argv[1]);
int nw = std::atoi(argv[2]);
std::string filename = argv[3];
std::string outFilename = argv[4];
std::ofstream outputFile;
double distance;
auto t_start = std::chrono::high_resolution_clock::now();
std::vector<std::pair<double,double>> points;
std::vector<std::future<KnnType*>> futures;
readFile(points,filename);
int taskLength = (int) (points.size() / nw);
int remainingPoints = (points.size() % nw);
int start = 0;
int end = remainingPoints > 0 ? taskLength + 1 : taskLength;
remainingPoints --;
for(int i = 0; i < nw - 1; i++) {
Task* t = new Task(start,end,k,&points);
start = end;
end = remainingPoints > 0 ? end + taskLength + 1 : end + taskLength;
remainingPoints --;
futures.push_back(
std::async(std::launch::async, computeKNN, t)
);
}
Task* t = new Task(start,end,k,&points);
KnnType* my_knns;
my_knns = computeKNN(t);
std::vector<KnnType*> workers_knns;
for (int j = 0; j < nw - 1; j++) {
workers_knns.push_back(futures.at(j).get());
}
workers_knns.push_back(my_knns);
writeFile(workers_knns,outFilename);
auto t_end = std::chrono::high_resolution_clock::now();
double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end-t_start).count();
std::cout << elapsed_time_ms << std::endl;
return 0;
}