26 #include <sys/syscall.h> 40 unsigned long KernelTests::tsc;
50 const auto pid = syscall(SYS_gettid);
54 return sched_setaffinity(__pid_t(pid),
sizeof(mask), &mask);
62 const auto sum = std::accumulate(values.begin(), values.end(), 0L);
67 const auto mean = sum / (double) number_of_iterations;
69 auto stddev_accumulator = 0.0;
71 stddev_accumulator = pow((v / BenchmarkParameters::loop) - mean, 2);
75 return {mean, stddev};
80 std::vector<unsigned> sequence(number);
81 std::iota(sequence.begin(), sequence.end(), 0);
88 std::ifstream input_stream(filename, std::ios::binary);
90 std::vector<char> buffer((std::istreambuf_iterator<char>(input_stream)),
91 std::istreambuf_iterator<char>());
93 if(buffer.size() == 0)
96 auto aligned_buffer = aligned_malloc<char>((int) buffer.size(), 64);
98 if(aligned_buffer ==
nullptr)
99 throw std::runtime_error(
"Failed to allocate memory for the test vector!");
101 std::copy(buffer.begin(), buffer.end(), aligned_buffer);
103 return aligned_buffer;
110 std::ifstream json_stream(filename);
111 if(!json_stream.is_open())
114 json_stream >> result;
122 constexpr
auto ns_per_sec = 1E9;
124 struct timespec sleeptime = {.tv_nsec = __syscall_slong_t(5E8) };
126 struct timespec t_start, t_end;
128 if (clock_gettime(CLOCK_MONOTONIC_RAW, &t_start) == 0)
132 nanosleep(&sleeptime,NULL);
133 clock_gettime(CLOCK_MONOTONIC_RAW, &t_end);
137 unsigned long ns = (
unsigned long)((t_end.tv_sec - t_start.tv_sec) * ns_per_sec + t_end.tv_nsec - t_start.tv_nsec);
139 double secs = (double) ns / ns_per_sec;
141 unsigned long resolution_timer = (
unsigned long)((end - start)/secs);
144 std::cout <<
"[----------] System clock (rdtsc) resolution " << resolution_timer <<
" [Hz]" << std::endl;
145 std::cout <<
"[----------] Ticks per us " << tick_per_usec << std::endl;
151 LARGE_INTEGER tick_per_sec;
152 QueryPerformanceFrequency(&tick_per_sec);
154 std::cout <<
"[----------] System clock (rdtsc) resolution unknown" << std::endl;
155 std::cout <<
"[----------] Ticks per us " << (tick_per_sec.QuadPart / 1000000) << std::endl;
156 return (
unsigned long) tick_per_sec.QuadPart;
165 unsigned long hi, lo;
167 __asm
volatile (
"rdtsc" :
"=a"(lo),
"=d"(hi));
169 return lo | (hi << 32);
175 void KernelTests::print_and_store_results(
const std::string &isa,
const std::string ¶meters,
176 const std::string &
module_name,
const std::string &test_name,
177 const std::string &unit,
const int para_factor,
178 const double mean,
const double stddev)
180 std::cout <<
"[----------] " <<
"Mean" <<
" = " << std::fixed << mean <<
" us" << std::endl;
181 std::cout <<
"[----------] " <<
"Stddev" <<
" = " << stddev <<
" us" << std::endl;
186 RecordProperty(
"parameters", parameters);
188 RecordProperty(
"isa", isa);
189 RecordProperty(
"unit", unit);
190 RecordProperty(
"parallelization_factor", para_factor);
192 RecordProperty(
"mean", std::to_string(mean));
193 RecordProperty(
"stddev", std::to_string(stddev));
json read_json_from_file(const std::string &filename)
Read JSON from the given file.
a class to store JSON values
static std::string test_type
char * read_data_to_aligned_array(const std::string &filename)
Read binary data from the file.
std::pair< double, double > calculate_statistics(const std::vector< long > values)
Calculate the mean and variance from the result of the run_benchmark.
unsigned long tsc_recovery()
Measure the TSC on the machine.
const std::string module_name
int bind_to_cpu(const unsigned cpu)
Attach current process to the selected core.
unsigned long tsc_tick()
Return the current value of the TSC.
std::vector< unsigned > get_sequence(const unsigned number)
For a given number return sequence of number from 0 to number - 1.