75 [[gnu::always_inline]]
void push(const
Field& v) noexcept
152 size_t size() const noexcept {
return x.size(); }
183 size_t tail() const noexcept {
return x.tail(); }
184 size_t size() const noexcept {
return x.size(); }
185 size_t capacity() const noexcept {
return x.capacity(); }
193 for (
size_t k = 0; k < count; ++k) {
206 for (
size_t g = 0; g <
x.num_full_vectors(); ++g) {
207 const auto xs =
x[g].to_array();
208 const auto ys =
y[g].to_array();
210 kernel(xs[l], ys[l], k++);
213 for (
size_t t = 0; t <
x.tail(); ++t) {
214 kernel(
x.tail_elem(t),
y.tail_elem(t), k++);
237 x.adopt_cursor(src.x);
238 y.adopt_cursor(src.y);
247template <
typename Span,
typename First>
251 span.adopt_cursor(first);
255template <
typename Tuple,
typename Kernel,
size_t... I>
261 const size_t num_full = first.num_full_vectors();
262 const size_t ntail = first.tail();
263 for (
size_t g = 0; g < num_full; ++g) {
266 for (
size_t t = 0; t < ntail; ++t) {
282template <
typename... Args> [[gnu::always_inline]]
inline void zip_for_each(Args&&... args)
284 static_assert(
sizeof...(Args) >= 2,
"zip_for_each needs at least one span and a kernel");
285 constexpr size_t n =
sizeof...(Args);
304template <Direction Dir,
typename Params,
typename Step>
313 const size_t ntail = in.
tail();
315 for (
size_t g = num_full; g-- > 0;) {
316 step(bulk_acc, in[g],
out[g]);
318 for (
size_t t = ntail; t-- > 0;) {
322 for (
size_t g = 0; g < num_full; ++g) {
323 step(bulk_acc, in[g],
out[g]);
325 for (
size_t t = 0; t < ntail; ++t) {
329 out.adopt_cursor(in);
330 return { bulk_acc, tail_acc };
340template <Direction Dir,
typename Field,
typename Kernel>
346 constexpr int64_t PREFETCH_AHEAD = 4;
347 Field*
const px = buckets.x.
data();
348 Field*
const py = buckets.y.data();
349 for (
size_t s = 0; s < n; ++s) {
352 :
static_cast<int64_t
>(i) + PREFETCH_AHEAD;
353 if (pf >= 0 &&
static_cast<size_t>(pf) < n) {
354 __builtin_prefetch(px + pairs[pf].first, 1, 3);
355 __builtin_prefetch(px + pairs[pf].second, 0, 3);
356 __builtin_prefetch(py + pairs[pf].first, 1, 3);
357 __builtin_prefetch(py + pairs[pf].second, 0, 3);
359 const uint32_t dst = pairs[i].first;
360 const uint32_t src = pairs[i].second;
361 kernel(px[dst], py[dst], px[src], py[src], i);
367template <Direction Dir,
typename Field,
typename Kernel>
369 const uint32_t* indices,
373 constexpr int64_t PREFETCH_AHEAD = 4;
374 Field*
const px = buckets.x.data();
375 Field*
const py = buckets.y.data();
376 for (
size_t s = 0; s < n; ++s) {
379 :
static_cast<int64_t
>(i) + PREFETCH_AHEAD;
380 if (pf >= 0 &&
static_cast<size_t>(pf) < n) {
381 __builtin_prefetch(px + indices[pf], 1, 3);
382 __builtin_prefetch(py + indices[pf], 1, 3);
384 const uint32_t
b = indices[i];
385 kernel(px[
b], py[
b], i);
#define BB_ASSERT(expression,...)
void adopt_shape_if_writable(Span &span, const First &first) noexcept
void zip_for_each_impl(Tuple &spans, Kernel kernel, std::index_sequence< I... > seq)
Entry point for Barretenberg command-line interface.
void zip_for_each(Args &&... args)
std::pair< VectorField< Params >, field< Params > > map_accumulate(const VectorFieldPushSpan< Params > &in, VectorFieldPushSpan< Params > &out, VectorField< Params > bulk_acc, field< Params > tail_acc, Step step)
int64_t index_of(std::vector< T > const &vec, T const &item)
void for_each_indexed_point(AffineColumnSpan< Field > &buckets, const uint32_t *indices, size_t n, Kernel kernel) noexcept
void for_each_indexed_pair(AffineColumnSpan< Field > &buckets, const std::pair< uint32_t, uint32_t > *pairs, size_t n, Kernel kernel) noexcept
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > out
size_t size() const noexcept
size_t num_full_vectors() const noexcept
VectorFieldPushSpan< Params > y
size_t tail() const noexcept
VectorFieldPushSpan< Params > x
VectorAffineElementPushSpan(std::span< Vec > x_fields, std::span< Vec > y_fields) noexcept
void scatter_to(AffineColumnSpan< Field > &buckets, IndexFn index_of) const
typename Vec::Field Field
VectorAffineElementPushSpan()=default
void for_each_point(Kernel kernel) const
void gather_from(const AffineColumnSpan< Field > &buckets, IndexFn index_of, size_t count)
size_t size() const noexcept
void push_point(const Field &px, const Field &py) noexcept
size_t capacity() const noexcept
void adopt_cursor(const VectorAffineElementPushSpan &src) noexcept
static constexpr size_t SIZE
void adopt_cursor(const VectorFieldPushSpan &src) noexcept
size_t size() const noexcept
void push(const Field &v) noexcept
static constexpr size_t W
bool shares_backing(const VectorFieldPushSpan &other) const noexcept
typename Vec::Field Field
size_t capacity() const noexcept
VectorFieldPushSpan(VectorFieldPushSpan &&) noexcept=default
const Field & tail_elem(size_t t) const noexcept
VectorFieldPushSpan()=default
const Field * tail_data() const noexcept
Vec & operator[](size_t g) noexcept
VectorFieldPushSpan(std::span< Vec > vector_fields_) noexcept
size_t num_full_vectors() const noexcept
const Vec & operator[](size_t g) const noexcept
Field & tail_elem(size_t t) noexcept
bool aliases(const VectorFieldPushSpan &other) const noexcept
std::array< Field, W > partial
size_t tail() const noexcept
VectorField< Params > Vec
VectorFieldPushSpan & operator=(const VectorFieldPushSpan &)=delete
VectorFieldPushSpan(const VectorFieldPushSpan &)=delete
std::span< Vec > vector_fields
General class for prime fields see Prime field documentation["field documentation"] for general imple...