diff --git a/5/pp/README.md b/5/pp/README.md new file mode 100644 index 0000000..e15754d --- /dev/null +++ b/5/pp/README.md @@ -0,0 +1 @@ +# Parallel Programming diff --git a/5/pp/rayon_demo/.gitignore b/5/pp/rayon_demo/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/5/pp/rayon_demo/.gitignore @@ -0,0 +1 @@ +/target diff --git a/5/pp/rayon_demo/Cargo.lock b/5/pp/rayon_demo/Cargo.lock new file mode 100644 index 0000000..b88ce83 --- /dev/null +++ b/5/pp/rayon_demo/Cargo.lock @@ -0,0 +1,200 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[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 = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[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]] +name = "rayon_demo" +version = "0.1.0" +dependencies = [ + "rand", + "rayon", +] + +[[package]] +name = "syn" +version = "2.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/5/pp/rayon_demo/Cargo.toml b/5/pp/rayon_demo/Cargo.toml new file mode 100644 index 0000000..930afce --- /dev/null +++ b/5/pp/rayon_demo/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rayon_demo" +version = "0.1.0" +edition = "2024" + +[dependencies] +rand = "0.9.2" +rayon = "1.11.0" diff --git a/5/pp/rayon_demo/README.md b/5/pp/rayon_demo/README.md new file mode 100644 index 0000000..516f73e --- /dev/null +++ b/5/pp/rayon_demo/README.md @@ -0,0 +1,20 @@ +# Rayon Demo + +Second additional task for the Parallel Programming class. Shows how effortlessly [rayon](https://github.com/rayon-rs/rayon) speedups the workloads. + +Launch with: +```bash +cargo run --release +``` + +Execution result (CPU with 8 cores): +``` +Генерування 10000000 випадкових чисел... +Початок тестування... + +Послідовно: знайдено 472801 простих чисел за 34.234398653s +Паралельно: знайдено 472801 простих чисел за 4.742153237s + +Прискорення: 7.22x +``` + diff --git a/5/pp/rayon_demo/src/main.rs b/5/pp/rayon_demo/src/main.rs new file mode 100644 index 0000000..13cc877 --- /dev/null +++ b/5/pp/rayon_demo/src/main.rs @@ -0,0 +1,50 @@ +use rayon::prelude::*; +use std::time::Instant; + +// Функція для перевірки числа на простоту (навантаження CPU) +fn is_prime(n: u32) -> bool { + if n <= 1 { + return false; + } + for i in 2..=(f64::from(n).sqrt() as u32) { + if n.is_multiple_of(i) { + return false; + } + } + true +} + +fn main() { + // Підготовка даних + let data_size = 10_000_000; + println!("Генерування {data_size} випадкових чисел..."); + + // Тут теж використано Rayon для швидкої генерації + let numbers: Vec = (0..data_size) + .into_par_iter() + .map(|_| rand::random::()) + .collect(); + + println!("Початок тестування...\n"); + + // Послідовне виконання + let start_seq = Instant::now(); + let count_seq = numbers.iter().filter(|&&x| is_prime(x)).count(); + let duration_seq = start_seq.elapsed(); + + println!("Послідовно: знайдено {count_seq} простих чисел за {duration_seq:?}"); + + // Паралельне виконання з Rayon + let start_par = Instant::now(); + let count_par = numbers + .par_iter() // Вся магія тут + .filter(|&&x| is_prime(x)) + .count(); + let duration_par = start_par.elapsed(); + + println!("Паралельно: знайдено {count_par} простих чисел за {duration_par:?}"); + + // Висновок + let speedup = duration_seq.as_secs_f64() / duration_par.as_secs_f64(); + println!("\nПрискорення: {speedup:.2}x"); +}