source: doc/theses/thierry_delisle_PhD/code/utils.hpp @ b2a37b0

arm-ehjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-expr
Last change on this file since b2a37b0 was b2a37b0, checked in by Thierry Delisle <tdelisle@…>, 2 years ago

Initial drafts in C++ of the CFA scheduler

  • Property mode set to 100644
File size: 2.3 KB
Line 
1#pragma once
2
3#include <cassert>
4#include <cstddef>
5#include <atomic>
6#include <chrono>
7#include <fstream>
8#include <iostream>
9
10#include <unistd.h>
11#include <sys/sysinfo.h>
12
13// Barrier from
14class barrier_t {
15public:
16        barrier_t(size_t total)
17                : waiting(0)
18                , total(total)
19        {}
20
21        void wait(unsigned) {
22                size_t target = waiting++;
23                target = (target - (target % total)) + total;
24                while(waiting < target)
25                        asm volatile("pause");
26
27                assert(waiting < (1ul << 60));
28        }
29
30private:
31        std::atomic<size_t> waiting;
32        size_t total;
33};
34
35class Random {
36private:
37        unsigned int seed;
38public:
39        Random(int seed) {
40                this->seed = seed;
41        }
42
43        /** returns pseudorandom x satisfying 0 <= x < n. **/
44        unsigned int next() {
45                seed ^= seed << 6;
46                seed ^= seed >> 21;
47                seed ^= seed << 7;
48                return seed;
49        }
50};
51
52static inline long long rdtscl(void) {
53    unsigned int lo, hi;
54    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
55    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
56}
57
58void affinity(int tid) {
59        static int cpus = get_nprocs();
60
61        cpu_set_t  mask;
62        CPU_ZERO(&mask);
63        int cpu = cpus - tid;  // Set CPU affinity to tid, starting from the end
64        CPU_SET(cpu, &mask);
65        auto result = sched_setaffinity(0, sizeof(mask), &mask);
66        if(result != 0) {
67                std::cerr << "Affinity set failed with " << result<< ", wanted " << cpu << std::endl;
68        }
69}
70
71static const constexpr std::size_t cache_line_size = 64;
72void check_cache_line_size() {
73        std::cout << "Checking cache line size" << std::endl;
74        const std::string cache_file = "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size";
75
76        std::ifstream ifs (cache_file, std::ifstream::in);
77
78        if(!ifs.good()) {
79                std::cerr << "Could not open file to check cache line size" << std::endl;
80                std::cerr << "Looking for: " << cache_file << std::endl;
81                std::exit(2);
82        }
83
84        size_t got;
85        ifs >> got;
86
87        ifs.close();
88
89        if(cache_line_size != got) {
90                std::cerr << "Cache line has incorrect size : " << got << std::endl;
91                std::exit(1);
92        }
93
94        std::cout << "Done" << std::endl;
95}
96
97using Clock = std::chrono::high_resolution_clock;
98using duration_t = std::chrono::duration<double>;
99using std::chrono::nanoseconds;
100
101template<typename Ratio, typename T>
102T duration_cast(T seconds) {
103        return std::chrono::duration_cast<std::chrono::duration<T, Ratio>>(std::chrono::duration<T>(seconds)).count();
104}
Note: See TracBrowser for help on using the repository browser.