Intel 8087의 탄젠트 계산, CORDIC과 다항식의 결합
원제 Reverse-engineering the Intel 8087's tangent algorithm: more than CORDIC
106 포인트댓글 11
Key Point
정수 시대 최고 성능의 부동소수점 칩이 어떻게 극복할 수 없어 보이던 성능 한계를 넘었는지 하드웨어 레벨에서 역공학한 분석으로, 현대 칩 설계가 해결하는 문제들의 근원을 보여준다.
핵심 요약
- 1980년 Intel 8087 칩의 탄젠트 명령어(FPTAN) 알고리즘을 역공학으로 분석한 글로, 8086 대비 90마이크로초 vs 13,000마이크로초의 극적인 성능 향상을 달성한 메커니즘을 설명한다.
- 8087은 CORDIC(좌표 회전 디지털 컴퓨터) 알고리즘과 Padé 근사 다항식을 결합했으며, 이는 1950년대 B-58 Hustler 폭격기 항법 컴퓨터를 위해 개발된 CORDIC을 16비트 정확도까지만 적용하고 나머지 각도는 다항식으로 처리하는 방식이다.
- CORDIC은 삼각함수를 특수 각도(arctan(2^-n))의 조합으로 분해한 뒤 회전 행렬을 적용하는데, 시프트와 덧셈만으로 계산할 수 있어 하드웨어 친화적이며 각 반복마다 1비트의 정확도를 얻는다.
- 8087의 탄젠트 알고리즘은 세 단계로 구성된다: (1) CORDIC 의사 나눗셈으로 입력 각도를 특수 각도로 근사하며 결정 비트를 기록, (2) 매우 작은 나머지 각도에 대해 3x/(3-x²) 형태의 Padé 근사로 초기 벡터 생성, (3) CORDIC 의사 곱셈으로 기록된 결정 비트에 따라 벡터 회전을 역순으로 적용한다.
- FPTAN 명령어는 탄젠트 값 자체 대신 두 좌표값(X, Y)을 분리하여 반환하는데, 이는 당시 나눗셈이 느렸기 때문이며 일부 최적화 경우에 이점이 있다.
- 8087의 내부 데이터 포맷은 80비트 부동소수점으로 부호(1비트) + 지수(15비트, 바이어스 16383) + 가수(64비트)로 구성되며, 임시 레지스터 tmpC는 오버플로우 방지와 올림을 위해 68비트 가수와 3개의 추가 비트를 갖는다.
- 마이크로코드는 1648개의 16비트 명령어로 구성되며 FPTAN은 #1039번지부터 시작한다. 입력 각도의 지수에 따라 세 가지 경로로 분기한다: 지수가 -64 이하면 탄젠트값이 입력값과 같으므로 그대로 반환, -17 이하면 CORDIC을 건너뛰고 다항식으로 직진, -1~-16이면 CORDIC 경로를 수행한다.
- CORDIC 의사 나눗셈 루프에서 계산된 결정 비트는 칩 우측의 16비트 시프트 레지스터에 저장되는데, 레이아웃의 유휴 공간에 배치되었다. 마이크로코드는 64비트 정수 산술을 사용하여 최적화되었으며, 루프의 각 사이클마다 값이 약 2배씩 감소하도록 암묵적 지수가 변한다.
- 다항식 근사 계산에서 가장 시간 소비적인 부분은 SQUARE 루틴(곱셈)이며, 8087은 Booth 알고리즘을 사용하여 한 번에 2비트씩 곱한다.
- CORDIC 의사 곱셈 단계에서는 저장된 결정 비트에 따라 루프를 돌며 벡터를 회전시키는데, 각 회전은 시프트, 덧셈, 뺄셈으로만 구성되어 저비용이며 작은 각도부터 역순으로 적용하여 반올림 오차를 감소시킨다.
- 최종 단계에서 X 좌표의 최고 비트를 검사하여 지수를 0 또는 -1로 정규화한 뒤, 계산된 X와 Y 좌표를 스택에 푸시하여 결과를 반환한다.
- 칩의 미세 사진과 회로도 분석을 통해 마이크로코드 ROM은 칩 중앙의 큰 직사각형 영역이며, 데이터경로는 칩 하단에 위치하고 지수 ROM, 상수 ROM, 시프터, 가산기 등 함수 블록들로 구성됨을 확인했다.