pfor/benchmarks/common.h

66 lines
1.6 KiB
C++

#ifndef PFOR_BENCHMARKS_COMMON_H
#define PFOR_BENCHMARKS_COMMON_H
#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
#include <pfor/pfor.h>
template<std::size_t n>
constexpr auto _ = pfor::ctv<n>;
using TimePoint = std::tuple<long, long>;
TimePoint timepoint() {
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
long realSec = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
long realUsec = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
return {realSec, realUsec};
}
double timediff(TimePoint const& from, TimePoint const& to) {
return std::get<0>(to)-std::get<0>(from) + (std::get<1>(to)-std::get<1>(from))/1'000'000.;
}
// Operand utility
#define OPERAND(Type, name, size, filler) \
Type * name##_ = new Type[size]; \
{ \
std::size_t i = 0; \
std::generate_n(name##_, size, [&i]{ return filler; }); \
} \
auto name = pfor::Operand<Type*, class ID##name>(name##_);
#define END_OPERAND(name) delete[] name##_
// Bench utility
#define BENCH(K) { \
TimePoint tp0 = timepoint(); \
for(std::size_t k_ = 0; k_ < K; ++k_) {
#define END_BENCH() } \
TimePoint tp1 = timepoint(); \
std::cout << "time: " << timediff(tp0, tp1) << std::endl; \
}
template<typename K, typename S>
void arraysPrinter(K, S) {}
template<typename K, typename S, typename T, typename... Ts>
void arraysPrinter(K k, S n, T&& array, Ts&&... arrays) {
if(k != 1) {
std::cerr << "warning: displays may be false, must set K to 1" << std::endl;
std::exit(1);
}
for(S i = 0; i < n; ++i)
std::cout << std::forward<T>(array)[i] << ", ";
std::cout << std::endl;
arraysPrinter(k, n, std::forward<Ts>(arrays)...);
}
#endif