[Rust] rayon
rayon์ rust์ ๊ฒฝ๋ ๋ณ๋ ฌ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฆฌ๋ค.
tokio์ async-std์๋ ๋ฐฉํฅ์ฑ์ด ์ข ๋ค๋ฅด๋ค.
rayon์ async/await์ ์ง์ํ์ง๋ ์๋๋ค. ๋๊ธฐ์ ๊ด๋ฆฌ๋ณด๋ค๋ ๋จ์ํ ๋์ ์ฒ๋ฆฌ์ ์ง์คํ ๊ฒฝํฅ์ด ์๋ค.
๊ทธ๋์ datarace๊ฐ ์์์ ํ์คํ๊ฒ ๋ณด์ฅํ๋ค.
๋ณ๋ ฌ์ฒ๋ฆฌ ํฐ์ค๋๊ฐ์ธ openMP์ ๊ฒฝ์ํ๋ ๊ด๊ณ์ธ ๊ฒ ๊ฐ๋ค. ๋ฒค์น๋งํฌ๋ค ๋ดค์๋๋ ์์ง ์ข ๋ค์ณ์ง๋ ๊ฒ ๊ฐ๊ธฐ๋...
๋ณต์กํ ๋น์ฆ๋์ค๋ก์ง์ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ณด๋จ ๋ํ ๋ฐ์ดํฐ์ ์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ ๋ ์ข ์ ๋ง๋ ๊ตฌ์กฐ์ธ ๊ฒ ๊ฐ๋ค.
์ฌ์ฉ๋ฒ
์์ฃผ ๊ฐ๋ฒผ์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ฌ์ ์ธํ
์ด ํ์ํ์ง๋ ์๋ค.
๋ํ๋์ ํ๋ ์ถ๊ฐํด์ฃผ๋ฉด ๋์ด๋ค.


์๋๋ rayon์ผ๋ก ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์๋ํ๋ ์์ฃผ ๊ฐ๋จํ ์์ ์ฝ๋๋ค.
๊ฐ ์์๋ฅผ ์ ๊ณฑํ๋ค์์ ๋ํ๋ค.
prelude๋ฅผ importํ๊ธฐ๋ง ํด๋ ๊ด๋ จ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ๋์คํจ์น๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฒ๋ ๊ฐ๋จํ ํธ์ด๋ค.
use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
input
.par_iter() // <-- just change that!
.map(|&i| i * i)
.sum()
}
fn main() {
let dataset = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
println!("{}", sum_of_squares(&dataset));
}
par_iter๋ก iterator๋ฅผ ์์ฑํ๋ ์๊ฐ๋ถํฐ ๋์์ ์ ์ด๋ rayon์๊ฒ ๋์ด๊ฐ๋ค. parellel iterator์ ์ถ์ฝ์ด๋๋ค.
์์์ ๋ณ๋ ฌ ์ค์ผ์ค๋ง์ ํด์ค๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๊ณ ์คํํ๋ฉด
๊ธฐ๋ํ๋๋ก ๋์ํ ๊ฒ์ด๋ค.
๋ช ์์ ๋ณ๋ ฌ์ฒ๋ฆฌ: join
๋ ๋ ํ ๊ตญ๋ฐฅ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ธ quick-sort๋ฅผ ์์๋ก ๋ค์ด๋ณด๊ฒ ๋ค.
๋ณดํต์ ์๋์ ๊ฐ์ด ์ฌ๊ท์ ๋ฐ๋ณต์ ํตํด ๋ถํ -ํธ์ถํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ๋ฐ
์ ๊ธฐ์ quick-sort๋ฅผ lo์ hi์ ๋ํด์ ํธ์ถํ๋ ๋ถ๋ถ์ ์ฌ์ค ์ด๋ค ์์๋ก ์ฒ๋ฆฌ๋์ด๋ ์๊ด์ด ์๋ ๋ถ๋ถ์ด๋ค.
์ฆ, ๋ณ๋ ฌ์ฒ๋ฆฌ์ ์ต์ ํ๋๋ ์ผ์ด์ค๋ค.
rayon์ ์ฌ์ฉํ๋ฉด ์ด์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ฝ๊ฒ ์ํํ ์ ์๋ค.

์ด๋ฐ ๋๋์ผ๋ก ์ฐ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://docs.rs/rayon/latest/rayon/
https://smallcultfollowing.com/babysteps/blog/2015/12/18/rayon-data-parallelism-in-rust/