Multithreading improvements.

This commit is contained in:
Sean Bowe 2016-09-17 20:49:56 -06:00
parent f65e36a684
commit f86b6d2613
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
2 changed files with 17 additions and 4 deletions

View File

@ -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 || {

View File

@ -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)