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/affine_add_packed.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 F >
void bb::scalar_multiplication::round_parallel_detail::msm_parallel_for (size_t num_threads, F &&body) noexcept
 Small-N fast-path: per-thread Jacobian Pippenger over a partition of the input.
 
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=0, size_t max_threads=0) noexcept
 Single-MSM_fast, no-affine-trick Pippenger over window_bits-wide windows.
 
template<typename Curve >
size_t bb::scalar_multiplication::compute_arena_bytes_for_msm (size_t n_input, bool external_glv_provided, bool dedup_active, size_t max_threads) 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, size_t dedup_info=0, std::span< const typename Curve::AffineElement > external_glv_doubled={}, std::span< std::byte > external_arena={}, size_t max_threads=0) 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, size_t dedup_info) 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, size_t dedup_info) 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, size_t dedup_info) 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, size_t dedup_info) 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, size_t dedup_info) 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, size_t dedup_info) 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, size_t dedup_info, std::span< const curve::BN254::AffineElement > external_glv_doubled, std::span< std::byte > external_arena, size_t max_threads) 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, size_t dedup_info, std::span< const curve::Grumpkin::AffineElement > external_glv_doubled, std::span< std::byte > external_arena, size_t max_threads) 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, size_t max_threads) 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, size_t max_threads) 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, size_t max_threads) 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, size_t max_threads) noexcept
 
template size_t bb::scalar_multiplication::compute_arena_bytes_for_msm< curve::BN254 > (size_t, bool, bool, size_t) noexcept
 

Variable Documentation

◆ add_scratch

Definition at line 177 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_indices

std::span<uint32_t> affine_bucket_indices

Definition at line 202 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_inversion_scratch

std::span<BaseField> affine_bucket_inversion_scratch

Definition at line 203 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_pairs

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

Definition at line 201 of file scalar_multiplication_fast.cpp.

◆ affine_bucket_stride

size_t affine_bucket_stride = 0

Definition at line 204 of file scalar_multiplication_fast.cpp.

◆ base_addr

uintptr_t base_addr = 0

Definition at line 213 of file scalar_multiplication_fast.cpp.

◆ capacity

size_t capacity = 0

Definition at line 214 of file scalar_multiplication_fast.cpp.

◆ chunk_infos

std::span<AffineBucketChunkInfo> chunk_infos

Definition at line 207 of file scalar_multiplication_fast.cpp.

◆ curr_buckets

std::span<uint32_t> curr_buckets

Definition at line 167 of file scalar_multiplication_fast.cpp.

◆ curr_pts

std::span<AffineElement> curr_pts

Definition at line 166 of file scalar_multiplication_fast.cpp.

◆ cursor

size_t cursor = 0

Definition at line 215 of file scalar_multiplication_fast.cpp.

◆ data

std::byte* data = nullptr

Definition at line 212 of file scalar_multiplication_fast.cpp.

◆ dense_buckets

bb::AffineColumnSpan<BaseField> dense_buckets

Definition at line 199 of file scalar_multiplication_fast.cpp.

◆ is_present

std::span<uint8_t> is_present

Definition at line 200 of file scalar_multiplication_fast.cpp.

◆ lhs

Definition at line 174 of file scalar_multiplication_fast.cpp.

◆ local_owner

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

Definition at line 211 of file scalar_multiplication_fast.cpp.

◆ out

Definition at line 176 of file scalar_multiplication_fast.cpp.

◆ overflow_len

size_t overflow_len = 0

Definition at line 188 of file scalar_multiplication_fast.cpp.

◆ overflow_pts

std::span<AffineElement> overflow_pts

Definition at line 187 of file scalar_multiplication_fast.cpp.

◆ overflow_slots

std::span<uint32_t> overflow_slots

Definition at line 186 of file scalar_multiplication_fast.cpp.

◆ pair_dest

std::span<uint32_t> pair_dest

Definition at line 178 of file scalar_multiplication_fast.cpp.

◆ result_len

size_t result_len = 0

Definition at line 180 of file scalar_multiplication_fast.cpp.

◆ rhs

Definition at line 175 of file scalar_multiplication_fast.cpp.