-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathmain.cpp
102 lines (88 loc) · 2.21 KB
/
main.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
#include <iostream>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <numeric>
#include <algorithm>
#include "ticktock.h"
// TODO: 并行化所有这些 for 循环
template <class T, class Func>
std::vector<T> fill(std::vector<T> &arr, Func const &func) {
TICK(fill);
for (size_t i = 0; i < arr.size(); i++) {
arr[i] = func(i);
}
TOCK(fill);
return arr;
}
template <class T>
void saxpy(T a, std::vector<T> &x, std::vector<T> const &y) {
TICK(saxpy);
for (size_t i = 0; i < x.size(); i++) {
x[i] = a * x[i] + y[i];
}
TOCK(saxpy);
}
template <class T>
T sqrtdot(std::vector<T> const &x, std::vector<T> const &y) {
TICK(sqrtdot);
T ret = 0;
for (size_t i = 0; i < std::min(x.size(), y.size()); i++) {
ret += x[i] * y[i];
}
ret = std::sqrt(ret);
TOCK(sqrtdot);
return ret;
}
template <class T>
T minvalue(std::vector<T> const &x) {
TICK(minvalue);
T ret = x[0];
for (size_t i = 1; i < x.size(); i++) {
if (x[i] < ret)
ret = x[i];
}
TOCK(minvalue);
return ret;
}
template <class T>
std::vector<T> magicfilter(std::vector<T> const &x, std::vector<T> const &y) {
TICK(magicfilter);
std::vector<T> res;
for (size_t i = 0; i < std::min(x.size(), y.size()); i++) {
if (x[i] > y[i]) {
res.push_back(x[i]);
} else if (y[i] > x[i] && y[i] > 0.5f) {
res.push_back(y[i]);
res.push_back(x[i] * y[i]);
}
}
TOCK(magicfilter);
return res;
}
template <class T>
T scanner(std::vector<T> &x) {
TICK(scanner);
T ret = 0;
for (size_t i = 0; i < x.size(); i++) {
ret += x[i];
x[i] = ret;
}
TOCK(scanner);
return ret;
}
int main() {
size_t n = 1<<26;
std::vector<float> x(n);
std::vector<float> y(n);
fill(x, [&] (size_t i) { return std::sin(i); });
fill(y, [&] (size_t i) { return std::cos(i); });
saxpy(0.5f, x, y);
std::cout << sqrtdot(x, y) << std::endl;
std::cout << minvalue(x) << std::endl;
auto arr = magicfilter(x, y);
std::cout << arr.size() << std::endl;
scanner(x);
std::cout << std::reduce(x.begin(), x.end()) << std::endl;
return 0;
}