자동 병렬화에서 의존 연산 겹침 추정
초록
프로파일링 데이터를 이용해 함수 호출 간 입력·출력 시점을 파악하고, 공유 변수의 생산·소비 시점을 비교해 두 연산이 병렬 실행 시 겹치는 정도를 계산한다. 이를 통해 비용 대비 이득이 큰 병렬화 후보만을 선택해 Mercury 컴파일러에 자동으로 적용한다.
상세 분석
이 논문은 자동 병렬화에서 흔히 간과되는 “데이터 의존성에 의한 병렬 효율 감소” 문제를 정량적으로 해결한다. 기존의 입문적 접근은 작업 단위의 실행 시간만을 기준으로 스폰 비용을 초과하는지를 판단했지만, 실제로는 두 연산이 공유 변수에 대해 생산(producer)과 소비(consumer) 관계를 가질 때, 생산 시점이 늦고 소비 시점이 빠르면 병렬화가 오히려 성능 저하를 초래한다. 저자들은 Mercury 언어의 강력한 모드 시스템과 미래(future) 메커니즘을 활용해 각 변수의 “생성 시점”과 “소비 시점”을 정밀히 추적한다. 프로파일링 단계에서 각 원자적 서브골(goal)의 실행 시간과 호출 횟수를 기록하고, 이를 바탕으로 각 conjunct(병렬 구문 안의 서브 목표)의 전체 실행 시간과 내부 변수 흐름을 모델링한다.
핵심 알고리즘은 두 conjunct 사이의 공유 변수 집합을 구하고, 각 변수에 대해 생산 시점과 소비 시점을 시간축 상에 매핑한다. 이후 생산 시점이 소비 시점보다 앞선 경우 겹치는 구간(overlap)을 계산하고, 전체 병렬 실행 시간은 가장 큰 병목 구간을 기준으로 추정한다. 이때 스폰 오버헤드와 미래 신호·대기 비용도 포함한다. 또한, 다중 conjunct가 존재할 경우 가능한 파티션(예: (c1 & c2) & c3, c1 & (c2 & c3) 등)을 모두 평가해 가장 작은 예상 실행 시간을 갖는 구성을 선택한다. 탐색은 깊이 우선으로 진행되며, 각 호출의 총 비용이 사전 정의된 임계값을 초과하고, 현재까지 발견된 병렬 작업량이 목표 머신의 코어 수를 초과하지 않을 때만 상세히 분석한다.
이 접근법의 장점은 (1) 프로파일링만으로 자동화가 가능해 개발자가 별도 어노테이션을 작성할 필요가 없으며, (2) 프로그램 구조가 바뀌어도 재프로파일링 후 즉시 새로운 병렬화 후보를 도출할 수 있다는 점이다. 또한, Mercury의 결정적(det) 목표에만 적용함으로써 비결정적 코드에서 발생할 수 있는 복잡한 롤백·재시도 비용을 회피한다. 실험 결과는 아직 예비 단계이지만, 대표적인 벤치마크에서 1.2~1.8배 정도의 속도 향상을 보였으며, 특히 공유 변수의 생산·소비 시점이 서로 멀리 떨어진 경우에 큰 이득을 얻었다.
댓글 및 학술 토론
Loading comments...
의견 남기기