Abstract
수치 계산에서는 속도와 정확도 사이의 상충(trade-off)을 고려하는 것이 중요하다. 그러나 기존 컴파일러는 속도와 정확도를 동시에 고려하면서, 실행 환경까지 반영하는 데 한계가 있다. 본 글은 여러 구현 후보의 비용과 정확도를 비교해 실행 환경에 맞는 후보를 제공하는 수치 컴파일러 Chassis를 소개한다.
본문
수치 계산은 속도와 정확도 사이의 시소 문제다. 빠른 계산은 부정확하고, 정확한 계산은 느리다. Clang 같은 전통적 컴파일러는 실행 환경에 맞춘 성능 최적화에 강하지만 수치 정확도에는 제한적이다. 반면 Herbie 같은 수치 컴파일러는 정확도에 집중하지만 실제 하드웨어나 라이브러리 특성은 충분히 반영하지 못한다.
Chassis는 이 절충을 실행 환경에 맞게 최적화한다. 같은 수식이라도 실행 환경에 따라 더 빠르거나 더 정확한 구현이 가능하기 때문이다. 예를 들어 AVX 환경에서는 $x/y$를 그대로 나눗셈으로 구현하는 대신, $1/y$의 빠른 근사 명령어인 $\texttt{rcpps}(y)$를 사용해 $x \times \texttt{rcpps}(y)$로 구현할 수 있다.
목표 기술 언어(target description language)는 각 연산이 나타내는 수식, 비용, 정확도를 명시한다. 예를 들어 AVX의 나눗셈은 정확하지만 비싸고, $\texttt{rcpps}$는 저렴하지만 비교적 부정확하다. 이러한 정보는 Chassis가 같은 수학식을 여러 구현으로 비교하고 탐색하는 기준이 된다.
Chassis는 동치 그래프(e-graph)를 사용해 한 수식의 여러 구현을 동시에 탐색하고, 속도와 정확도 기준에서 파레토 최적인 후보만 제공한다. 가령 $x/y$는 $x/y$, $x \times (1/y)$, $x \times \texttt{rcpps}(y)$ 등으로 구현될 수 있다. 이 후보들은 하나의 동치 그래프 안에서 관리된다. 그리고 사용자는 높은 정확도가 필요할 때 $x/y$ 를, 빠른 실행이 중요할 때 $x\times \texttt{rcpps}(y)$를 선택할 수 있다. 더 부정확하고 느린 후보는 파레토 최적이 아니므로 제외된다.
Chassis의 의의는 속도와 정확도 사이의 상충을 자동으로 탐색하고, 선택 가능한 후보들을 제시한다는 점이다. 이는 단일 기준의 최적해보다, 상충하는 목표 사이에서 비교 가능한 절충안의 집합이 더 유용할 수 있음을 보여준다.