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);
48 const size_t n = scalars_span.size();
50 return Curve::Group::point_at_infinity;
52 BB_ASSERT_GTE(all_points.size(), scalars_span.start_index + n);
60 std::vector<ScalarField> compact_scalars;
61 std::vector<AffineElement> compact_points;
62 compact_scalars.reserve(n);
63 compact_points.reserve(n);
64 const ScalarField* src_scalars = scalars_span.span.data();
65 const AffineElement* src_points = all_points.data() + scalars_span.start_index;
66 for (
size_t i = 0; i < n; ++i) {
67 if (!src_scalars[i].is_zero()) {
68 compact_scalars.push_back(src_scalars[i]);
69 compact_points.push_back(src_points[i]);
72 const size_t n_active = compact_scalars.size();
74 return Curve::Group::point_at_infinity;
84 const size_t num_threads = std::min(n_active, max_threads);
85 if (num_threads <= 1) {
86 std::span<const AffineElement> pts(compact_points.data(), n_active);
87 std::span<const ScalarField> scs(compact_scalars.data(), n_active);
88 return Element::straus_msm(pts, scs);
94 std::vector<Element> partials(num_threads, Curve::Group::point_at_infinity);
96 const size_t lo = (tid * n_active) / num_threads;
97 const size_t hi = ((tid + 1) * n_active) / num_threads;
98 const size_t slice_n = hi - lo;
102 std::span<const AffineElement> pts(compact_points.data() + lo, slice_n);
103 std::span<const ScalarField> scs(compact_scalars.data() + lo, slice_n);
104 partials[tid] = Element::straus_msm(pts, scs);
106 Element total_result = partials[0];
107 for (
size_t t = 1; t < num_threads; ++t) {
108 total_result += partials[t];
Curve::Element trivial_msm_threaded(PolynomialSpan< const typename Curve::ScalarField > scalars_span, std::span< const typename Curve::AffineElement > all_points) noexcept
Multi-threaded straus_msm driver for very-small MSMs.