parallelize longest period finder
This commit is contained in:
54
Cargo.lock
generated
54
Cargo.lock
generated
@@ -2,6 +2,60 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-deque"
|
||||||
|
version = "0.8.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-epoch",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-epoch"
|
||||||
|
version = "0.9.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam-utils"
|
||||||
|
version = "0.8.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "either"
|
||||||
|
version = "1.15.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rayon"
|
||||||
|
version = "1.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
|
||||||
|
dependencies = [
|
||||||
|
"either",
|
||||||
|
"rayon-core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rayon-core"
|
||||||
|
version = "1.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-deque",
|
||||||
|
"crossbeam-utils",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tea-3"
|
name = "tea-3"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"rayon",
|
||||||
|
]
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
rayon = "1.11.0"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ mod period;
|
|||||||
mod tea3;
|
mod tea3;
|
||||||
|
|
||||||
use lfsr::Lfsr;
|
use lfsr::Lfsr;
|
||||||
use period::{longest_period, period_bruteforce, period_floyd, period_paper};
|
use period::{longest_period_parallel, period_bruteforce, period_floyd, period_paper};
|
||||||
use tea3::Tea3;
|
use tea3::Tea3;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@@ -65,7 +65,7 @@ fn main() {
|
|||||||
// println!("\nPaper period p20: {}", period_paper(vec![0x7a, 0x02, 0x00, 0x00, 0x00]));
|
// println!("\nPaper period p20: {}", period_paper(vec![0x7a, 0x02, 0x00, 0x00, 0x00]));
|
||||||
// println!("\nPaper period p27: {}", period_paper(vec![0x00, 0x00, 0x00, 0x00, 0x00]));
|
// println!("\nPaper period p27: {}", period_paper(vec![0x00, 0x00, 0x00, 0x00, 0x00]));
|
||||||
|
|
||||||
let (p, seed) = longest_period();
|
let (p, seed) = longest_period_parallel();
|
||||||
println!("\nLongest period: {}", p);
|
println!("\nLongest period: {}", p);
|
||||||
println!("Seed: {:02x?}", seed);
|
println!("Seed: {:02x?}", seed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
|
||||||
use crate::tea3::Tea3;
|
use crate::tea3::Tea3;
|
||||||
|
|
||||||
@@ -177,3 +178,19 @@ pub fn longest_period() -> (u64, [u8; 5]) {
|
|||||||
|
|
||||||
(best_period, best_seed)
|
(best_period, best_seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn longest_period_parallel() -> (u64, [u8; 5]) {
|
||||||
|
let limit: usize = 1usize << 40;
|
||||||
|
|
||||||
|
(0usize..limit)
|
||||||
|
.into_par_iter()
|
||||||
|
.map(|x| {
|
||||||
|
let seed = Reg5::from_u40(x as u64);
|
||||||
|
let p = period_h(seed);
|
||||||
|
(p, seed.0)
|
||||||
|
})
|
||||||
|
.reduce(
|
||||||
|
|| (0u64, [0u8; 5]),
|
||||||
|
|a, b| if a.0 >= b.0 { a } else { b },
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user