mirror of https://github.com/zcash/mpc.git
Multithreading improvements.
This commit is contained in:
parent
f65e36a684
commit
f86b6d2613
|
@ -1,6 +1,15 @@
|
||||||
use bn::*;
|
use bn::*;
|
||||||
use crossbeam;
|
use crossbeam;
|
||||||
|
|
||||||
|
fn calculate_window_size<T>(v: &[T], threads: usize) -> usize
|
||||||
|
{
|
||||||
|
if threads >= v.len() {
|
||||||
|
v.len()
|
||||||
|
} else {
|
||||||
|
v.len() / threads
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parallel_all<
|
pub fn parallel_all<
|
||||||
G: Group,
|
G: Group,
|
||||||
F: Fn(&[G], &[G]) -> bool + Sync
|
F: Fn(&[G], &[G]) -> bool + Sync
|
||||||
|
@ -11,7 +20,7 @@ pub fn parallel_all<
|
||||||
let f = &f;
|
let f = &f;
|
||||||
|
|
||||||
crossbeam::scope(|scope| {
|
crossbeam::scope(|scope| {
|
||||||
let window_size = v1.len() / threads;
|
let window_size = calculate_window_size(v1, threads);
|
||||||
let mut tasks = vec![];
|
let mut tasks = vec![];
|
||||||
for i in v1.chunks(window_size).zip(v2.chunks(window_size)) {
|
for i in v1.chunks(window_size).zip(v2.chunks(window_size)) {
|
||||||
tasks.push(scope.spawn(move || {
|
tasks.push(scope.spawn(move || {
|
||||||
|
@ -34,7 +43,7 @@ pub fn parallel_two<
|
||||||
let f = &f;
|
let f = &f;
|
||||||
|
|
||||||
crossbeam::scope(|scope| {
|
crossbeam::scope(|scope| {
|
||||||
let window_size = v1.len() / threads;
|
let window_size = calculate_window_size(v1, threads);
|
||||||
let mut j = 0;
|
let mut j = 0;
|
||||||
for v in v1.chunks_mut(window_size)
|
for v in v1.chunks_mut(window_size)
|
||||||
.zip(v2.chunks_mut(window_size))
|
.zip(v2.chunks_mut(window_size))
|
||||||
|
@ -57,7 +66,7 @@ pub fn parallel<
|
||||||
let f = &f;
|
let f = &f;
|
||||||
|
|
||||||
crossbeam::scope(|scope| {
|
crossbeam::scope(|scope| {
|
||||||
let window_size = v.len() / threads;
|
let window_size = calculate_window_size(v, threads);
|
||||||
let mut j = 0;
|
let mut j = 0;
|
||||||
for v in v.chunks_mut(window_size) {
|
for v in v.chunks_mut(window_size) {
|
||||||
scope.spawn(move || {
|
scope.spawn(move || {
|
||||||
|
|
|
@ -74,6 +74,8 @@ pub fn checkvec<Group1: Group, Group2: Group>(
|
||||||
where Group1: Pairing<Group2>
|
where Group1: Pairing<Group2>
|
||||||
{
|
{
|
||||||
parallel_all(v1, v2, |v1, v2| {
|
parallel_all(v1, v2, |v1, v2| {
|
||||||
|
assert_eq!(v1.len(), v2.len());
|
||||||
|
|
||||||
let rng = &mut ::rand::thread_rng();
|
let rng = &mut ::rand::thread_rng();
|
||||||
let mut p = Group1::zero();
|
let mut p = Group1::zero();
|
||||||
let mut q = Group1::zero();
|
let mut q = Group1::zero();
|
||||||
|
@ -84,7 +86,9 @@ where Group1: Pairing<Group2>
|
||||||
q = q + (*b * alpha);
|
q = q + (*b * alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.is_zero() || q.is_zero() {
|
if p.is_zero() && q.is_zero() {
|
||||||
|
true
|
||||||
|
} else if p.is_zero() || q.is_zero() {
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
same_power(&Spair::new(p, q).unwrap(), a)
|
same_power(&Spair::new(p, q).unwrap(), a)
|
||||||
|
|
Loading…
Reference in New Issue