[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/