alsk/celero/bone/serial.cpp

71 lines
2.1 KiB
C++

#include <celero/Celero.h>
#include <alsk/alsk.h>
#include "common.h"
using namespace bench;
using namespace alsk::arg;
using namespace alsk::edsl;
constexpr unsigned samples = 50, iterations = 100;
constexpr std::size_t vecSize = 100'000;
constexpr int minValue = -250, maxValue = +250;
decltype(auto) hwSerial(int min, int max) {
Task task0{vecSize}, task1{vecSize};
Data v0 = task0(min, max), v1 = task1(min, max);
Data const& v = select(v0, v1);
return project(v, rand());
}
decltype(auto) hwSerialBad(int min, int max) {
Task task0{vecSize}, task1{vecSize};
Data v2 = select(task0(min, max), task1(min, max));
return project(v2, rand());
}
constexpr auto eRand = makeOperand<int(), FN(rand)>();
constexpr auto lTask = link<Data(P<0>, P<1>)>(eTask);
constexpr auto eSerial = link<R<4>(int, int)>(lTask & lTask & link<Data(R<0>, R<1>)>(eSelect) & eRand & link<Value(R<2>, R<3>)>(eProject));
constexpr auto eRandStdFun = makeOperand<int(), std::function<int()>>();
constexpr auto lTaskStdFun = link<Data(P<0>, P<1>)>(eTaskStdFun);
constexpr auto eSerialStdFun = link<R<4>(int, int)>(
lTaskStdFun & lTaskStdFun & link<Data(R<0>, R<1>)>(eSelectStdFun) &
eRandStdFun & link<Value(R<2>, R<3>)>(eProjectStdFun));
BASELINE(Serial, Handwritten, samples, iterations) {
celero::DoNotOptimizeAway(
hwSerial(minValue, maxValue)
);
}
BENCHMARK(Serial, HandwrittenBad, samples, iterations) {
celero::DoNotOptimizeAway(
hwSerialBad(minValue, maxValue)
);
}
BENCHMARK(Serial, Skeleton, samples, iterations) {
auto serial = alsk::edsl::implement<alsk::exec::Sequential>(eSerial);
serial.skeleton.task<0>().size = vecSize;
serial.skeleton.task<1>().size = vecSize;
celero::DoNotOptimizeAway(
serial(minValue, maxValue)
);
}
BENCHMARK(Serial, SkeletonStdFunction, samples, iterations) {
auto serial = alsk::edsl::implement<alsk::exec::Sequential>(eSerialStdFun);
serial.skeleton.task<0>() = Task{vecSize};
serial.skeleton.task<1>() = Task{vecSize};
serial.skeleton.task<2>() = bench::select;
serial.skeleton.task<3>() = rand;
serial.skeleton.task<4>() = project;
celero::DoNotOptimizeAway(
serial(minValue, maxValue)
);
}