Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
scalar_multiplication_fast.cpp File Reference
#include "./scalar_multiplication_fast.hpp"
#include "./pippenger_arena_layout.hpp"
#include "./pippenger_constantine.hpp"
#include "./pippenger_dedup.hpp"
#include "barretenberg/common/assert.hpp"
#include "barretenberg/common/thread.hpp"
#include "barretenberg/ecc/curves/bn254/bn254.hpp"
#include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp"
#include "barretenberg/ecc/groups/element_impl.hpp"
#include "barretenberg/numeric/bitop/get_msb.hpp"
#include <barretenberg/env/hardware_concurrency.hpp>
#include <algorithm>
#include <atomic>
#include <bit>
#include <cstddef>
#include <cstdint>
#include <limits>
#include <memory>
#include <span>
#include <vector>
#include "./pippenger_fallbacks.hpp"
#include "./pippenger_batched.hpp"

Go to the source code of this file.

Namespaces

namespace  bb
 Entry point for Barretenberg command-line interface.
 
namespace  bb::scalar_multiplication
 
namespace  bb::scalar_multiplication::round_parallel_detail
 

Functions

size_t bb::scalar_multiplication::window_bits_tuning_oversub_factor (size_t n_input)
 N-dependent oversubscription factor used ONLY for choose_window_bits' target_load formula (not for actual thread dispatch).
 
template<typename Curve >
Curve::Element bb::scalar_multiplication::round_parallel_detail::pippenger_round_parallel_jacobian_fast (std::span< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, size_t min_pts_per_thread_override) noexcept
 Small-N fast-path: per-thread Jacobian Pippenger over a partition of the input.
 
template<typename Curve >
size_t bb::scalar_multiplication::compute_arena_bytes_for_msm (size_t n_input, bool external_glv_provided, bool dedup_active) noexcept
 Round-parallel Pippenger MSM_fast. Windows process sequentially (high-to-low) but each window is fully parallel across threads. Windows are processed in batches of windows_in_batch to amortise parallel_for barriers; the batch count is sized at runtime to fit BATCH_MEM_BUDGET (~32 MiB).
 
template<typename Curve >
Curve::Element bb::scalar_multiplication::pippenger_round_parallel (PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool dedup_hint=false, std::span< const typename Curve::AffineElement > external_glv_doubled={}, std::span< std::byte > external_arena={}) noexcept
 State of the art pippenger_fast multiscalar multiplication algorithm.
 
template<typename Curve >
Curve::Element bb::scalar_multiplication::pippenger_unsafe_fast (PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool dedup_hint) noexcept
 
template<typename Curve >
Curve::Element bb::scalar_multiplication::pippenger_fast (PolynomialSpan< const typename Curve::ScalarField > scalars, std::span< const typename Curve::AffineElement > points, bool handle_edge_cases, bool dedup_hint) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::pippenger_unsafe_fast< curve::BN254 > (PolynomialSpan< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, bool dedup_hint) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::pippenger_unsafe_fast< curve::Grumpkin > (PolynomialSpan< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, bool dedup_hint) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::pippenger_fast< curve::BN254 > (PolynomialSpan< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, bool handle_edge_cases, bool dedup_hint) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::pippenger_fast< curve::Grumpkin > (PolynomialSpan< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, bool handle_edge_cases, bool dedup_hint) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::pippenger_round_parallel< curve::BN254 > (PolynomialSpan< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, bool dedup_hint, std::span< const curve::BN254::AffineElement > external_glv_doubled, std::span< std::byte > external_arena) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::pippenger_round_parallel< curve::Grumpkin > (PolynomialSpan< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, bool dedup_hint, std::span< const curve::Grumpkin::AffineElement > external_glv_doubled, std::span< std::byte > external_arena) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::trivial_msm< curve::BN254 > (PolynomialSpan< const curve::BN254::ScalarField > scalars_span, std::span< const curve::BN254::AffineElement > all_points) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::trivial_msm< curve::Grumpkin > (PolynomialSpan< const curve::Grumpkin::ScalarField > scalars_span, std::span< const curve::Grumpkin::AffineElement > all_points) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::trivial_msm_threaded< curve::BN254 > (PolynomialSpan< const curve::BN254::ScalarField > scalars_span, std::span< const curve::BN254::AffineElement > all_points) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::trivial_msm_threaded< curve::Grumpkin > (PolynomialSpan< const curve::Grumpkin::ScalarField > scalars_span, std::span< const curve::Grumpkin::AffineElement > all_points) noexcept
 
template curve::BN254::Element bb::scalar_multiplication::round_parallel_detail::pippenger_round_parallel_jacobian_fast< curve::BN254 > (std::span< const curve::BN254::ScalarField > scalars, std::span< const curve::BN254::AffineElement > points, size_t min_pts_per_thread_override) noexcept
 
template curve::Grumpkin::Element bb::scalar_multiplication::round_parallel_detail::pippenger_round_parallel_jacobian_fast< curve::Grumpkin > (std::span< const curve::Grumpkin::ScalarField > scalars, std::span< const curve::Grumpkin::AffineElement > points, size_t min_pts_per_thread_override) noexcept
 
template size_t bb::scalar_multiplication::compute_arena_bytes_for_msm< curve::BN254 > (size_t, bool, bool) noexcept
 

Variable Documentation

◆ affine_bucket_indices

std::span<uint32_t> affine_bucket_indices

Definition at line 196 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_inversion_scratch

std::span<BaseField> affine_bucket_inversion_scratch

Definition at line 197 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_pairs

std::span<std::pair<uint32_t, uint32_t> > affine_bucket_pairs

Definition at line 195 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_stride

size_t affine_bucket_stride = 0

Definition at line 198 of file scalar_multiplication_fast.cpp.

◆ base_addr

uintptr_t base_addr = 0

Definition at line 207 of file scalar_multiplication_fast.cpp.

◆ capacity

size_t capacity = 0

Definition at line 208 of file scalar_multiplication_fast.cpp.

◆ chunk_infos

std::span<AffineBucketChunkInfo> chunk_infos

Definition at line 201 of file scalar_multiplication_fast.cpp.

◆ curr_buckets

std::span<uint32_t> curr_buckets

Definition at line 168 of file scalar_multiplication_fast.cpp.

◆ curr_pts

std::span<AffineElement> curr_pts

Definition at line 167 of file scalar_multiplication_fast.cpp.

◆ cursor

size_t cursor = 0

Definition at line 209 of file scalar_multiplication_fast.cpp.

◆ data

std::byte* data = nullptr

Definition at line 206 of file scalar_multiplication_fast.cpp.

◆ dense_buckets

std::span<AffineElement> dense_buckets

Definition at line 193 of file scalar_multiplication_fast.cpp.

◆ inversion_scratch

std::span<BaseField> inversion_scratch

Definition at line 172 of file scalar_multiplication_fast.cpp.

◆ is_present

std::span<uint8_t> is_present

Definition at line 194 of file scalar_multiplication_fast.cpp.

◆ local_owner

std::unique_ptr<std::byte[]> local_owner

Definition at line 205 of file scalar_multiplication_fast.cpp.

◆ overflow_len

size_t overflow_len = 0

Definition at line 183 of file scalar_multiplication_fast.cpp.

◆ overflow_pts

std::span<AffineElement> overflow_pts

Definition at line 182 of file scalar_multiplication_fast.cpp.

◆ overflow_slots

std::span<uint32_t> overflow_slots

Definition at line 181 of file scalar_multiplication_fast.cpp.

◆ pair_dest

std::span<uint32_t> pair_dest

Definition at line 173 of file scalar_multiplication_fast.cpp.

◆ points_to_add

std::span<AffineElement> points_to_add

Definition at line 171 of file scalar_multiplication_fast.cpp.

◆ result_len

size_t result_len = 0

Definition at line 175 of file scalar_multiplication_fast.cpp.