mold - 대규모 병렬 링커

1 week ago 20

mold는 대형 C++ 프로그램의 링크 병목을 줄이기 위해 Unix/Linux 링크 파이프라인의 모든 주요 패스를 데이터 병렬 방식으로 설계한 프로덕션 품질 링커임 입력 파일 파싱과 심볼 해석을 분리해 아카이브의 모든 멤버를 병렬로 파싱한 뒤, 원자적 비교 후 교환(compare-and-swap)으로 심볼을 병렬 해석함 9개 대규모 실제 워크로드에서 LLVM lld보다 2.4~16.1배, GNU ld보다 최대 112배 빨랐으며 수 GiB 규모의 디버그 바이너리를 수초 이내, 흔히 1초 미만에 링크함 재배치 스캔부터 출력 생성까지 전체 패스를 병렬화해 Amdahl의 법칙에 따라 직렬 구간이 만드는 성능 한계를 줄임 제거 연구에서는 단일 최적화가 성능 향상을 지배하지 않았으며, 모든 패스를 병렬화한 누적 효과가 속도 향상의 핵심이었음 기존 링커의 병목과 mold의 병렬 구조 링크는 컴파일된 오브젝트 파일을 하나의 실행 파일이나 공유 라이브러리로 결합하지만, 대형 프로그램에서는 수십 초가 걸려 하루에도 여러 번 반복되는 편집-컴파일-디버그 주기의 병목이 됨 TensorFlow 디버그 빌드는 24GiB의 오브젝트 파일을 9.9GiB 공유 라이브러리로 결합함 64코어 머신에서 LLVM lld로 링크하면 52초가 걸리며 대부분의 코어는 유휴 상태로 남음 기존 링커는 심볼 해석과 아카이브 처리가 서로 얽혀 있어 병렬 처리 범위가 제한됨 mold는 주요 패스를 심볼·재배치·섹션과 같은 동질적 요소의 배열을 순회하는 데이터 병렬 루프로 구성함 동기화가 필요한 소수 지점에는 동시성 자료구조와 원자적 연산을 사용함 모든 입력 파일과 각 아카이브의 모든 멤버를 먼저 병렬로 파싱함 이후 심볼 해석을 별도 병렬 패스로 실행하고 원자적 비교 후 교환을 적용함 이 병렬 구조는 재배치 스캔, 섹션 가비지 컬렉션, 동일 코드 폴딩, 문자열 병합, 레이아웃 계산, 출력 생성에도 적용됨 일부 패스만 병렬화하면 직렬 구간이 Amdahl의 법칙에 따라 최대 속도 향상을 제한하므로, mold는 모든 주요 패스를 병렬화함 실제 워크로드 평가와 기법별 기여도 대규모 실제 프로그램에서 수 GiB 규모의 디버그 바이너리를 수초 이내에 링크하며, 흔히 1초 미만에 완료함 최신 lld보다 2.4~16.1배, 전통적인 GNU ld보다 최대 112배 빠른 성능을 기록함 제거 연구에서는 특정 최적화 하나가 성능을 지배하지 않았으며, 각 패스의 병렬화 효과가 누적돼 전...

Read Entire Article