Skip to content

Commit

Permalink
change: Move from maybe_rayon to rayon-1.8
Browse files Browse the repository at this point in the history
After seeing the issues with WASM that the last release (`0.5.0`) of
this crate made, the idea is to now control the compatibility with WASM
while at the same time, making it easy to handle.

In this line of work, the idea was to simply do the following:
- Use `rayon 1.8` as a dependency for paralellism which fixes the WASM
  compat issues with `multicore`-related things. See: rayon-rs/rayon#1019
  thanks @han0110 for the suggestion.
- Use conditional dev-dependency loading for `getrandom` such that we
  can compile the lib for WASM-targets in the CI without needing to have
  the dependency being pulled downstream.
- The `multicore` module is gone, and the rest of the code has been
  refactored since the "fallback" is now handled by rayon itself.
  • Loading branch information
CPerezz committed Jan 5, 2024
1 parent 0afb812 commit 39f280b
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 33 deletions.
10 changes: 7 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@ serde_json = "1.0.105"
hex = "0.4"
rand_chacha = "0.3.1"

# Added to make sure we are able to build the lib in the CI.
# Notice this will never be loaded for someone using this lib as dep.
[target.'cfg(all(target_arch = "wasm32", target_os = "unknown"))'.dev-dependencies]
getrandom = { version = "0.2", features = ["js"] }

[dependencies]
subtle = "2.4"
ff = { version = "0.13.0", default-features = false, features = ["std"] }
Expand All @@ -35,11 +40,10 @@ serde = { version = "1.0", default-features = false, optional = true }
serde_arrays = { version = "0.1.0", optional = true }
hex = { version = "0.4", optional = true, default-features = false, features = ["alloc", "serde"] }
blake2b_simd = "1"
maybe-rayon = { version = "0.1.0", default-features = false }
rayon = "1.8"

[features]
default = ["bits", "multicore"]
multicore = ["maybe-rayon/threads"]
default = ["bits"]
asm = []
bits = ["ff/bits"]
bn256-table = []
Expand Down
5 changes: 2 additions & 3 deletions src/fft.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use crate::multicore;
pub use crate::{CurveAffine, CurveExt};
use ff::Field;
use group::{GroupOpsOwned, ScalarMulOwned};
Expand Down Expand Up @@ -38,7 +37,7 @@ pub fn best_fft<Scalar: Field, G: FftGroup<Scalar>>(a: &mut [G], omega: Scalar,
r
}

let threads = multicore::current_num_threads();
let threads = rayon::current_num_threads();
let log_threads = threads.ilog2();
let n = a.len();
assert_eq!(n, 1 << log_n);
Expand Down Expand Up @@ -107,7 +106,7 @@ pub fn recursive_butterfly_arithmetic<Scalar: Field, G: FftGroup<Scalar>>(
a[1] -= &t;
} else {
let (left, right) = a.split_at_mut(n / 2);
multicore::join(
rayon::join(
|| recursive_butterfly_arithmetic(left, n / 2, twiddle_chunk * 2, twiddles),
|| recursive_butterfly_arithmetic(right, n / 2, twiddle_chunk * 2, twiddles),
);
Expand Down
1 change: 0 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ pub mod ff_ext;
pub mod fft;
pub mod hash_to_curve;
pub mod msm;
pub mod multicore;
pub mod serde;

pub mod bn256;
Expand Down
15 changes: 5 additions & 10 deletions src/msm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ use ff::PrimeField;
use group::Group;
use pasta_curves::arithmetic::CurveAffine;

use crate::multicore;

fn get_booth_index(window_index: usize, window_size: usize, el: &[u8]) -> i32 {
// Booth encoding:
// * step by `window` size
Expand Down Expand Up @@ -155,12 +153,12 @@ pub fn small_multiexp<C: CurveAffine>(coeffs: &[C::Scalar], bases: &[C]) -> C::C
pub fn best_multiexp<C: CurveAffine>(coeffs: &[C::Scalar], bases: &[C]) -> C::Curve {
assert_eq!(coeffs.len(), bases.len());

let num_threads = multicore::current_num_threads();
let num_threads = rayon::current_num_threads();
if coeffs.len() > num_threads {
let chunk = coeffs.len() / num_threads;
let num_chunks = coeffs.chunks(chunk).len();
let mut results = vec![C::Curve::identity(); num_chunks];
multicore::scope(|scope| {
rayon::scope(|scope| {
let chunk = coeffs.len() / num_threads;

for ((coeffs, bases), acc) in coeffs
Expand All @@ -186,10 +184,7 @@ mod test {

use std::ops::Neg;

use crate::{
bn256::{Fr, G1Affine, G1},
multicore,
};
use crate::bn256::{Fr, G1Affine, G1};
use ark_std::{end_timer, start_timer};
use ff::{Field, PrimeField};
use group::{Curve, Group};
Expand All @@ -200,12 +195,12 @@ mod test {
fn best_multiexp<C: CurveAffine>(coeffs: &[C::Scalar], bases: &[C]) -> C::Curve {
assert_eq!(coeffs.len(), bases.len());

let num_threads = multicore::current_num_threads();
let num_threads = rayon::current_num_threads();
if coeffs.len() > num_threads {
let chunk = coeffs.len() / num_threads;
let num_chunks = coeffs.chunks(chunk).len();
let mut results = vec![C::Curve::identity(); num_chunks];
multicore::scope(|scope| {
rayon::scope(|scope| {
let chunk = coeffs.len() / num_threads;

for ((coeffs, bases), acc) in coeffs
Expand Down
16 changes: 0 additions & 16 deletions src/multicore.rs

This file was deleted.

0 comments on commit 39f280b

Please sign in to comment.