Kernel alarms pass the alarm ID
[akaros.git] / tests / fpperf.cc
1 /* Chunk of code from stage 6 of fluidanimate, running on its own in a single
2  * process, meant to run on either linux or akaros (check the ifdef below). */
3
4 #include <stddef.h>
5 #include <stdint.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <float.h>
9 #include <math.h>
10 #include <cstdlib>
11 #include <cstring>
12 #include <algorithm>
13 #include <sys/time.h>
14 #include <pthread.h>
15
16 typedef float fptype;
17
18 class Vec3
19 {
20 public:
21   fptype x, y, z;
22
23   Vec3() {}
24   Vec3(fptype _x, fptype _y, fptype _z) : x(_x), y(_y), z(_z) {}
25
26   fptype  GetLengthSq() const         { return x*x + y*y + z*z; }
27   fptype  GetLength() const           { return sqrtf(GetLengthSq()); }
28   Vec3 &  Normalize()                 { return *this /= GetLength(); }
29
30   bool    operator == (Vec3 const &v) { return (x == v.x) && (y == v.y) && (z += v.z); }
31   Vec3 &  operator += (Vec3 const &v) { x += v.x;  y += v.y; z += v.z; return *this; }
32   Vec3 &  operator -= (Vec3 const &v) { x -= v.x;  y -= v.y; z -= v.z; return *this; }
33   Vec3 &  operator *= (fptype s)      { x *= s;  y *= s; z *= s; return *this; }
34   Vec3 &  operator /= (fptype s)      { fptype tmp = 1.f/s; x *= tmp;  y *= tmp; z *= tmp; return *this; }
35
36   Vec3    operator + (Vec3 const &v) const    { return Vec3(x+v.x, y+v.y, z+v.z); }
37   Vec3    operator + (fptype const &f) const  { return Vec3(x+f, y+f, z+f); }
38   Vec3    operator - () const                 { return Vec3(-x, -y, -z); }
39   Vec3    operator - (Vec3 const &v) const    { return Vec3(x-v.x, y-v.y, z-v.z); }
40   Vec3    operator * (fptype s) const         { return Vec3(x*s, y*s, z*s); }
41   Vec3    operator / (fptype s) const         { fptype tmp = 1.f/s; return Vec3(x*tmp, y*tmp, z*tmp); }
42
43   fptype  operator * (Vec3 const &v) const    { return x*v.x + y*v.y + z*v.z; }
44 };
45
46 float rand_f1 = 3.14;
47 float rand_f2 = 6.282222;
48 float rand_f3 = 443.38383;
49 float rand_f4;
50 float rand_f5;
51 static const fptype doubleRestDensity = 2000.0;
52 static const fptype viscosity = 0.4;
53
54 static const Vec3 rand_v3_1(0.1, -9.8, 30.0);
55 static const Vec3 rand_v3_2(0.2, -90.8, 0.5);
56 static const Vec3 rand_v3_3(7.3, -444.8, 8.0);
57 static const Vec3 rand_v3_4(8.4, -99.8, 0.8);
58
59 Vec3 output(0, 0, 0);
60
61 int main(int argc, char **argv)
62 {
63         struct timeval start_tv = {0};
64         struct timeval end_tv = {0};
65         uint64_t usec_diff;
66         if (argc < 3) {
67                 printf("Need 2 args\n");
68                 exit(-1);
69         }
70
71         /* Disable this if you want to compile for linux with the i686-ros-g++ */
72         #if 1
73         # ifdef __ros__
74         if (argc == 4) {
75                 pthread_can_vcore_request(FALSE);
76                 pthread_lib_init();                             
77                 printf("Vcore %d mapped to pcore %d\n", 0, __procinfo.vcoremap[0].pcoreid);
78         }
79         # endif
80         #endif
81
82         rand_f4 = (float)atoi(argv[1]);
83         rand_f5 = (float)atoi(argv[2]);
84         if (gettimeofday(&start_tv, 0))
85                 perror("Start time error...");
86         for (int i = 0; i < 300000000; i++) {
87         
88                 Vec3 disp = rand_v3_1 - rand_v3_2 * rand_f5;
89                 fptype distSq = disp.GetLengthSq();
90                 fptype dist = sqrtf(std::max(distSq, (fptype)1e-12));
91                 fptype hmr = rand_f1 - dist;
92                 
93                 Vec3 acc = disp * rand_f2 * (hmr*hmr/dist)
94                            * (rand_f3 + rand_f4 + rand_f5 - doubleRestDensity);
95                 acc += (rand_v3_3 - rand_v3_4 * rand_f5) * viscosity * hmr;
96                 acc /= rand_f5 * rand_f1;
97                 
98                 output += acc;
99         }
100         float ret = output.GetLengthSq();
101         if (gettimeofday(&end_tv, 0))
102                 perror("End time error...");
103         usec_diff = (end_tv.tv_sec - start_tv.tv_sec) * 1000000 +
104                     (end_tv.tv_usec - start_tv.tv_usec);
105         printf("%f, took %.3f sec\n", ret, (float)usec_diff / 1000000);
106         return 0;
107 }