Breaking out number_bucket.h, adding hook for also collecting performance data for PyCLIF.

parent 29cb306e
#include <pybind11/smart_holder.h>
#include "number_bucket.h"
#include <cstddef>
#include <memory>
#include <vector>
namespace hc { // holder comparison
template <int Serial>
struct number_bucket {
std::vector<double> data;
explicit number_bucket(std::size_t data_size = 0) : data(data_size, 1.0) {}
double sum() const {
std::size_t n = 0;
double s = 0;
const double *a = &*data.begin();
const double *e = &*data.end();
while (a != e) {
s += *a++;
n++;
}
if (n != data.size()) {
throw std::runtime_error("Internal consistency failure (sum).");
}
return s;
}
std::size_t add(const number_bucket &other) {
if (other.data.size() != data.size()) {
throw std::runtime_error("Incompatible data sizes.");
}
std::size_t n = 0;
double *a = &*data.begin();
const double *e = &*data.end();
const double *b = &*other.data.begin();
while (a != e) {
*a++ += *b++;
n++;
}
return n;
}
private:
number_bucket(const number_bucket &) = delete;
number_bucket(number_bucket &&) = delete;
number_bucket &operator=(const number_bucket &) = delete;
number_bucket &operator=(number_bucket &&) = delete;
};
using nb_up = pybind11_ubench::number_bucket<1>;
using nb_sp = pybind11_ubench::number_bucket<2>;
using nb_pu = pybind11_ubench::number_bucket<3>;
using nb_sh = pybind11_ubench::number_bucket<4>;
namespace py = pybind11;
......@@ -69,11 +32,6 @@ public:
T *get() { return ptr.get(); }
};
using nb_up = number_bucket<0>;
using nb_sp = number_bucket<1>;
using nb_pu = number_bucket<2>;
using nb_sh = number_bucket<3>;
static_assert(sizeof(padded_unique_ptr<nb_pu>) == sizeof(py::smart_holder),
"Unexpected sizeof mismatch.");
......
......@@ -11,6 +11,8 @@ import collections
import sys
import time
number_bucket_pc = None
def pflush(*args, **kwargs):
result = print(*args, **kwargs)
......@@ -28,7 +30,7 @@ def run(args):
call_repetitions_first_pass = 100
call_repetitions_target_elapsed_secs = 0.1
num_samples = 10
selected_holder_type = "*"
selected_holder_type = "all"
else:
assert len(args) == 7, (
"size_exponent_min size_exponent_max size_exponent_step"
......@@ -67,8 +69,11 @@ def run(args):
("sp", m.number_bucket_sp),
("pu", m.number_bucket_pu),
("sh", m.number_bucket_sh),
("pc", number_bucket_pc),
]:
if selected_holder_type != "*" and nb_label != selected_holder_type:
if nb_label == "pc" and nb_type is None:
continue
if selected_holder_type != "all" and nb_label != selected_holder_type:
continue
nb1 = nb_type(data_size)
nb2 = nb_type(data_size)
......
#pragma once
#include <cstddef>
#include <exception>
#include <iostream>
#include <vector>
namespace pybind11_ubench {
template <int Serial>
struct number_bucket {
std::vector<double> data;
explicit number_bucket(std::size_t data_size = 0) : data(data_size, 1.0) {}
double sum() const {
std::size_t n = 0;
double s = 0;
const double *a = &*data.begin();
const double *e = &*data.end();
while (a != e) {
s += *a++;
n++;
}
if (n != data.size()) {
std::cerr << "Internal consistency failure (sum)." << std::endl;
std::terminate();
}
return s;
}
std::size_t add(const number_bucket &other) {
if (other.data.size() != data.size()) {
std::cerr << "Incompatible data sizes (add)." << std::endl;
std::terminate();
}
std::size_t n = 0;
double *a = &*data.begin();
const double *e = &*data.end();
const double *b = &*other.data.begin();
while (a != e) {
*a++ += *b++;
n++;
}
return n;
}
private:
number_bucket(const number_bucket &) = delete;
number_bucket(number_bucket &&) = delete;
number_bucket &operator=(const number_bucket &) = delete;
number_bucket &operator=(number_bucket &&) = delete;
};
} // namespace pybind11_ubench
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment