[Rust 공식문서 한국어 정리] 72. Rust Rayon 가이드
[Rust 공식문서 한국어 정리] 72. Rust Rayon 가이드
원문 제목: rayon — Data parallelism for Rust
작성자: rayon Contributors
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust의 데이터 병렬 라이브러리인 rayon을 소개합니다.
Iterator API를 거의 그대로 유지하면서, 순차 연산을 자동으로 병렬로 변환하는 방법을 다룹니다.
par_iter, par_iter_mut, into_par_iter과 같은 병렬 이터레이터와, join, scope를 활용한 분할-정복 패턴을 중심으로 설명합니다.
스레드 풀 관리, 작업 도난(work-stealing), 그리고 Send/Sync 요구사항을 중심으로 병렬화의 안전성과 성능을 제시합니다.
CPU 집약적 계산을 병렬화하여 성능을 극대화하려는 Rust 개발자에게 가장 쉽고 강력한 도구입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① ParallelIterator: 순차 Iterator의 병렬 버전으로, par_iter()로 변환하여 사용합니다.
② Work-Stealing: 유휴 스레드가 바쁜 스레드의 작업 큐에서 작업을 훔쳐오는 스케줄링 방식입니다.
③ join: 두 개의 클로저를 병렬로 실행하고, 둘 다 완료될 때까지 대기합니다.
④ Thread Pool: rayon이 내부적으로 관리하는 스레드 풀로, CPU 코어 수에 맞춰 자동 조정됩니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
rayon은 데이터 병렬화를 간단하게 만드는 것이 목표입니다.
vec.iter().map(|x| x * 2).sum()을 vec.par_iter().map(|x| x * 2).sum()으로 바꾸기만 하면 병렬화됩니다.
Iterator API와 거의 동일하므로, 기존 코드를 병렬화하는 데 드는 노력이 거의 없습니다.
병렬 이터레이터는 작업을 작은 청크로 분할하여 여러 스레드에 분배합니다.
reduce, fold, map, filter, collect 등의 대부분의 Iterator 메서드가 병렬 버전으로 제공됩니다.
순서가 보장되어야 하는 경우에는 파이프라인 설계를 조정하거나, 순차 collect 후 후처리를 고려합니다.
join은 분할-정복 알고리즘에서 핵심적으로 사용됩니다.
rayon::join(|| left(), || right())는 left와 right를 병렬로 실행합니다.
재귀적으로 join을 사용하여, 퀵소트나 병합정렬을 병렬화할 수 있습니다.
rayon의 스레드 풀은 작업 도난(work-stealing) 방식으로 동작합니다.
각 스레드는 자신의 작업 큐를 가지며, 유휴 상태가 되면 다른 스레드의 큐에서 작업을 가져옵니다.
이를 통해 부하 불균형을 자동으로 완화하고, CPU 코어를 효율적으로 활용합니다.
병렬화는 Send와 Sync가 필요합니다.
병렬 이터레이터의 항목은 Send여야 하고, 공유 상태는 Sync여야 합니다.
RC나 RefCell과 같은 !Send/!Sync 타입은 병렬화에 사용할 수 없으므로, Arc와 Mutex 등으로 대체해야 합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
대규모 배열의 수치 연산을 par_iter()로 병렬화하여 CPU 코어를 모두 활용합니다.
이미지 처리 픽셀 루프를 par_iter_mut()로 변환하여, 대용량 이미지 처리 시간을 단축합니다.
rayon::join로 재귀 알고리즘(병합정렬, 행렬 곱셈)을 병렬화합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
rayon은 Rust 데이터 병렬화의 가장 쉬운 입구입니다.
Iterator API를 거의 그대로 유지하면서 병렬화를 달성하므로, 기존 코드 수정이 최소화됩니다.
작업 도난 기반의 스레드 풀은 효율적인 부하 분산을 자동으로 제공합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://docs.rs/rayon/latest/rayon/
rayon GitHub: https://github.com/rayon-rs/rayon
#Rust #Rayon #Parallelism #DataParallel #Performance #Iterator #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30