결정적 팀구성을 활용한 혼합형 작업 스틸링
초록
본 논문은 전통적인 작업 스틸링 기법을 확장하여, 실행 시 필요로 하는 스레드 수가 가변적인 데이터 병렬 작업을 효율적으로 처리할 수 있는 “결정적 팀구성” 방식을 제안한다. 제안된 알고리즘은 작업을 스레드 풀에 할당하고, 필요한 스레드 수 r에 맞춰 팀을 형성해 동시에 실행한다. 구현된 C++ 프로토타입을 기반으로, 데이터와 태스크 병렬성을 모두 활용하는 병렬 퀵소트에 적용했으며, 32코어 Intel Nehalem EX 시스템에서 기존 Cilk++ 대비 5.1배에서 8.7배로 속도 향상을 입증하였다.
상세 분석
이 논문은 작업 스틸링(work‑stealing)이라는 전통적인 동적 스케줄링 메커니즘을 데이터 병렬(task‑parallel)과 혼합된 형태의 작업에 적용하기 위해 두 가지 핵심 아이디어를 도입한다. 첫 번째는 “팀‑구성(team‑building)” 개념이다. 기존 작업 스틸링에서는 각 작업이 단일 스레드에 의해 실행되지만, 여기서는 작업이 요구하는 스레드 수 r≥1에 따라 여러 스레드가 하나의 팀을 이루어 동시에 실행한다. 팀은 결정적(deterministic) 방식으로 구성되는데, 이는 스레드가 자신의 로컬 작업 큐를 탐색하면서 “팀 리더”를 식별하고, 리더가 팀원을 모집하는 절차를 미리 정의된 순서에 따라 수행한다는 뜻이다. 이러한 결정적 절차는 팀 구성 과정에서 발생할 수 있는 경쟁을 최소화하고, 팀이 형성되는 시간을 예측 가능하게 만든다.
두 번째 아이디어는 “혼합형 작업(mixed‑mode task)” 지원이다. 작업은 두 가지 형태로 구분된다. (1) 전통적인 단일 스레드 작업, (2) 다중 스레드가 필요하도록 선언된 데이터 병렬 작업. 다중 스레드 작업은 작업 스택에 r값을 명시하고, 스레드가 팀을 구성할 때 해당 r값을 확인한다. 팀이 완성되면, 작업은 팀 전체에 할당되어 병렬적으로 실행된다. 팀이 완성되지 못하고 스레드가 부족한 경우, 스레드들은 기존에 대기 중인 다른 작업을 스틸링함으로써 전체 시스템의 활용률을 유지한다.
알고리즘의 정확성은 두 가지 관점에서 검증된다. 첫째, 팀이 형성되는 과정은 결정적이므로, 동일한 작업 흐름에서 언제나 동일한 스레드 집합이 팀을 이루어 데드락이나 경쟁 조건을 방지한다. 둘째, 작업 스틸링 메커니즘은 기존의 “작업을 스틸링할 때는 가장 최근에 삽입된 작업을 가져온다”는 LIFO 정책을 유지하면서, 팀‑구성 작업에 대해서는 팀 리더가 팀원을 모집하는 동안 다른 스레드가 해당 작업을 스틸링하지 못하도록 보호한다.
성능 분석에서는 이론적 복잡도와 실제 실행 시간을 비교한다. 팀‑구성 오버헤드는 팀을 모집하는 데 필요한 스레드 간 통신 비용과 팀 리더가 팀원을 확인하는 비용으로 모델링된다. 논문은 이 오버헤드가 작업당 r이 작을수록 무시할 수 있을 정도로 작으며, r이 커질수록 팀‑구성 비용이 증가하지만, 병렬 실행으로 얻는 속도 향상이 이를 상쇄한다는 실험적 증거를 제시한다.
구현 측면에서는 C++11의 std::thread와 atomic 연산을 활용해 경량화된 로컬 작업 큐와 전역 스틸링 큐를 설계하였다. 팀‑리더는 atomic compare‑and‑swap을 이용해 팀원을 모집하고, 팀이 완성되면 작업 함수를 팀 전체에 전달한다. 또한, 작업이 완료되면 팀‑리더가 팀원을 해제하고, 해제된 스레드들은 즉시 다른 작업을 스틸링하거나 로컬 큐에 새 작업을 삽입한다.
실험에서는 2^27‑1개의 무작위 정수를 정렬하는 병렬 퀵소트에 이 알고리즘을 적용하였다. 퀵소트는 파티션 단계에서 데이터 병렬 작업(다중 스레드가 필요)과 재귀 호출 단계에서 태스크 병렬 작업(단일 스레드)으로 구성된다. 32코어 Intel Nehalem EX 시스템에서 기존 Cilk++ 기반 구현이 5.1배의 속도 향상을 보인 반면, 제안된 팀‑구성 작업 스틸링은 8.7배까지 향상시켰다. 이는 특히 파티션 단계에서 다중 스레드 팀이 효과적으로 형성되어 메모리 대역폭과 캐시 활용도가 크게 증가했기 때문이다. 또한, 스레드 수가 증가함에 따라 스케일링 효율이 선형에 가깝게 유지되는 것을 확인하였다.
결론적으로, 결정적 팀‑구성을 도입한 작업 스틸링은 데이터 병렬 작업과 태스크 병렬 작업을 자연스럽게 혼합할 수 있는 강력한 프레임워크를 제공한다. 이는 기존의 작업 스틸링이 단일 스레드 작업에 국한되던 한계를 극복하고, 멀티코어·멀티스레드 환경에서 복합적인 병렬 패턴을 효율적으로 실행할 수 있게 한다.
댓글 및 학술 토론
Loading comments...
의견 남기기