저수준 스레드 프리미티브를 이용한 논리 프로그램의 간단하고 효율적인 명시적 병렬화
본 논문은 XSB Prolog의 테이블드 프로그램을 다중 스레드로 자동 변환하고, 답 테이블을 복사 없이 상수 시간에 병합하는 기법을 제안한다. 변환 과정은 쿼리 데이터를 분할하여 각 스레드에 할당하고, 세마포어 기반 중복 방지를 통해 완전성을 유지한다. 실험 결과, 트랜지티브 클로저와 포인팅 분석에서 2코어 환경에서 최대 45% 이상의 실행 시간 감소를 보였다.
저자: Diptikalyan Saha, Paul Fodor
본 논문은 논리 프로그래밍, 특히 XSB Prolog의 테이블드 프로그램을 현대 멀티코어 프로세서에 맞게 효율적으로 병렬화하는 방법을 제시한다. 서론에서는 기존의 Aurora, Muse, YapOR와 같은 WAM 기반 병렬 시스템이 하드웨어 비용과 복잡성 때문에 널리 채택되지 못했음을 지적하고, 현재 멀티코어 환경에서 선언형 언어가 어떻게 병렬성을 활용할 수 있을지에 대한 필요성을 강조한다. 특히, 잘 정의된 웰-파운드 의미론 아래에서 모든 답을 찾아야 하는 테이블드 연산은 병렬화가 어려운 문제로 남아 있었다.
제안된 방법은 크게 세 단계로 구성된다. 첫 번째 단계는 “맵” 단계에 해당하며, 입력 쿼리의 첫 인자를 기준으로 가능한 여러 서브쿼리를 탐색하고, 두 개 이상의 후보가 존재할 경우 각각을 별도 스레드에 할당한다. 이때 스레드 생성은 XSB 내부에 정의된 thread_create 프리미티브를 사용하고, 각 스레드 내부에서는 기존의 테이블드 규칙을 그대로 실행한다. 두 번째 단계는 중복 실행을 방지하기 위한 “세마포어 검사”이다. Predicate Dependency Graph를 분석해 사이클에 포함된 리터럴 앞에 check_if_not_tried 라는 검사를 삽입함으로써, 이미 다른 스레드가 해당 서브쿼리를 수행 중이면 즉시 백트랙하도록 설계한다. 이 메커니즘은 개별 스레드가 독립적인 작업 집합을 수행하도록 보장하면서도 전체 해답 집합의 완전성을 유지한다. 세 번째 단계는 “리듀스” 단계로, 모든 자식 스레드가 종료된 후 답 테이블을 병합한다. 기존 XSB의 공유 트라이는 복사 비용이 크기 때문에, 저자는 각 스레드가 자체 트라이를 유지하고, 스레드 종료 시 부모 트라이의 포인터를 자식 트라이의 head_pointer 로 연결하는 방식으로 상수 시간 병합을 구현한다. 이 구조는 메모리 복사를 전혀 수행하지 않으며, 병합 오버헤드가 0.14초 수준으로 매우 낮다.
실험에서는 두 종류의 벤치마크를 사용하였다. 첫 번째는 완전 그래프에 대한 트랜지티브 클로저이며, 정점 수를 100에서 10,000까지 변화시켜 듀얼 코어 환경에서 실행 시간을 측정하였다. 두 스레드 구성에서는 평균 40.5%의 실행 시간 감소를 보였으며, 10K 정점에서는 8.22초에서 4.89초로 절반에 가까운 속도 향상을 달성했다. 두 번째 벤치마크는 Andersson 포인팅 분석으로, 단일 스레드 2.28초에 비해 공유 프레디케이트 기반 병합 1.64초, 제안된 상수 시간 병합은 1.19초(스레드1)와 1.05초(스레드2) 그리고 0.14초의 병합 오버헤드만을 기록하였다. 이는 기존 복사 기반 병합이 30% 이상의 오버헤드를 발생시키는 것과 크게 대비된다.
관련 연구에서는 Marques와 Swift의 “Concurrent and Local Evaluation of Normal Programs”가 테이블드 호출의 일관성을 다루지만 실제 병렬 실행과 답 병합을 제공하지 않는다. 또한 기존 Aurora, Muse, YapOR와 같은 시스템은 WAM 자체를 수정해 공유 메모리 구조를 도입했지만 구현 복잡도가 높고, 현대 멀티코어 환경에 최적화되지 않았다. 본 논문은 이러한 한계를 극복하고, 명시적 변환과 POSIX 스레드만으로도 높은 효율성을 달성한다는 점에서 차별성을 가진다.
결론에서는 제안된 변환 기법이 웰-파운드 의미론을 보존하면서도 자동으로 병렬 코드를 생성한다는 점을 강조하고, 현재는 XSB의 increval 패키지로 제공되고 있음을 알린다. 향후 연구 과제로는 다중 머신 환경에서 MapReduce 형태로 확장하고, 비재귀적이거나 더 복잡한 논리 프로그램에 대한 일반화, 그리고 스레드 수가 코어 수를 초과하는 경우의 스케줄링 최적화 등을 제시한다.
원본 논문
고화질 논문을 불러오는 중입니다...
댓글 및 학술 토론
Loading comments...
의견 남기기