66 lines
1.6 KiB
C++
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
|