23 const size_t n = scalars_span.size();
25 return Curve::Group::point_at_infinity;
27 BB_ASSERT_GTE(all_points.size(), scalars_span.start_index + n);
28 std::span<const AffineElement> points_view(&all_points[scalars_span.start_index], n);
29 std::span<const ScalarField> scalars_view(scalars_span.span.data(), n);
30 return Element::straus_msm(points_view, scalars_view);
44 size_t max_threads)
noexcept
49 const size_t n = scalars_span.size();
51 return Curve::Group::point_at_infinity;
53 BB_ASSERT_GTE(all_points.size(), scalars_span.start_index + n);
61 std::vector<ScalarField> compact_scalars;
62 std::vector<AffineElement> compact_points;
63 compact_scalars.reserve(n);
64 compact_points.reserve(n);
65 const ScalarField* src_scalars = scalars_span.span.data();
66 const AffineElement* src_points = all_points.data() + scalars_span.start_index;
67 for (
size_t i = 0; i < n; ++i) {
68 if (!src_scalars[i].is_zero()) {
69 compact_scalars.push_back(src_scalars[i]);
70 compact_points.push_back(src_points[i]);
73 const size_t n_active = compact_scalars.size();
75 return Curve::Group::point_at_infinity;
85 const size_t num_threads = std::min(n_active, pool_threads);
86 if (num_threads <= 1) {
87 std::span<const AffineElement> pts(compact_points.data(), n_active);
88 std::span<const ScalarField> scs(compact_scalars.data(), n_active);
89 return Element::straus_msm(pts, scs);
95 std::vector<Element> partials(num_threads, Curve::Group::point_at_infinity);
97 const size_t lo = (tid * n_active) / num_threads;
98 const size_t hi = ((tid + 1) * n_active) / num_threads;
99 const size_t slice_n = hi - lo;
103 std::span<const AffineElement> pts(compact_points.data() + lo, slice_n);
104 std::span<const ScalarField> scs(compact_scalars.data() + lo, slice_n);
105 partials[tid] = Element::straus_msm(pts, scs);
107 Element total_result = partials[0];
108 for (
size_t t = 1; t < num_threads; ++t) {
109 total_result += partials[t];
Curve::Element trivial_msm_threaded(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points, size_t max_threads) noexcept
Multi-threaded straus_msm driver for very-small MSMs.