- 쟁점은 흔한 부동소수점 sqrt가 아니라 정수 제곱근을 CPU 명령이나 하드웨어 기능으로 제공한 사례가 있었는지이며, Nintendo DS의 divider/square-rooter는 유사하지만 네이티브 명령은 아님
- Harris RTX 2000 Forth CPU와 군용급 RTX 2010은 다단계 square root 명령을 제공한 사례로 꼽히며, RTX 2000은 setup 1회와 step 15회로 결과를 얻는 구조였음
- 더 오래된 사례인 ENIAC은 1946년에 divider/square-rooter unit으로 decimal integer accumulator를 제어해 초당 최대 40회 나눗셈 또는 3회 제곱근 연산을 수행했음
- 정수 제곱근은 빠른 정수 곱셈기와 충분한 정밀도가 필요해 역사적 CPU에는 부담이 컸고, ARMv8의
frsqrte/frsqrts처럼 추정과 반복을 나눠 정확도·속도를 조절하는 방식도 있음 - Quake식 inverse square root는 현대 하드웨어에서 더 이상 일반적인 성능 우위가 없으며, 테이블 조회·보간·Halley 계열 반복·고정소수점 분할 정복 등은 구현 환경에 따라 선택지가 달라짐
질문의 범위와 Nintendo DS 사례
- 질문은 정수 제곱근 명령어를 실제로 구현한 프로세서가 있었는지를 다룸
- 부동소수점 square root 명령은 흔하지만, 정수 전용 square root 명령은 질문자가 본 적이 없다는 전제에서 출발함
- Nintendo DS에는 메모리 매핑된 integer divider/square rooter가 있었음
- ARM 프로세서에 FPU나 하드웨어 divider가 없어 3D 계산에 도움이 됨
- 다만 네이티브 프로세서 명령어가 아니라는 점이 질문의 주요 단서임
Harris RTX 2000과 RTX 2010
- Harris RTX 2000 Forth CPU는 다단계 square root 명령을 제공한 사례로 언급됨
- 군용급 sibling인 RTX 2010도 같은 계열의 기능을 제공함
- 관련 자료로 Stack Computers: RTX 2000가 연결됨
- RTX2000 Family Programmer’s Reference Manual에 따르면 이 기능은 반복형 square root에 가까우며, setup 명령 1개와 step 명령 15개를 실행해 최종 값을 얻는 방식임
- Ken Lyons의 “A Fast Method for Finding an Integer Square Root”도 RTX2000 계열의 하드웨어 구현과 프로그래밍 예시를 다룬 자료로 언급됨
ENIAC의 divider/square-rooter unit
- 1946년 ENIAC도 정수 제곱근 하드웨어 사례에 해당함
- 인용된 설명에 따르면 ENIAC은 accumulator 4개를 특수 multiplier unit으로 제어해 초당 최대 385회 곱셈을 수행함
- accumulator 5개는 특수 divider/square-rooter unit으로 제어되어 초당 최대 40회 나눗셈 또는 3회 제곱근 연산을 처리함
- ENIAC의 accumulator는 decimal integer로 동작했음
정수 제곱근 구현이 까다로운 이유
- 한 답변은 Newton-Raphson 반복으로 역제곱근을 구한 뒤 원래 값과 곱하는 방식을 square root 계산의 효율적 방법으로 설명함
- 이 방식은 “Quake method”로 알려져 있으며, 현대 CPU와 GPU에서는 초기 추정 명령과 반복 명령으로 일반화된 사례가 있음
- 이 접근의 핵심 제약은 빠른 multiplier가 필요하다는 점임
- 부동소수점 sqrt에는 빠른 FP multiplier가 필요하고, FPU는 이를 갖고 있음
- 정수 sqrt에는 빠른 integer multiplier가 필요하지만, 역사적으로 대부분의 CPU에는 그런 하드웨어가 없었다는 설명임
- 충분한 정밀도를 내려면 입력 폭의 두 배 폭을 가진 빠른 multiplier가 필요하다는 조건도 붙음
- 정밀도 요구가 항상 같지는 않기 때문에,
frsqrte와frsqrts처럼 추정과 반복을 나누면 원하는 속도·정확도 절충에 맞춰 반복 횟수를 조정할 수 있음
Quake 기법과 현대 sqrt 구현 논쟁
- 다른 답변은 Quake trick이 가장 효율적이라는 주장이 오래전부터 맞지 않았고, 특정 하드웨어에서 낮은 품질의 float 결과를 얻을 때만 해당한다고 반박함
- 현대 칩에서는 네이티브 sqrt 명령이 훨씬 빠르며, 종종 몇 클럭 사이클 수준이라고 설명함
- 더 빠른 방법으로는 비균등 간격 값 테이블을 저장하고, 두 값을 빠르게 가져와 보간한 뒤, base-2 exponent를 shift하고 필요하면 Newton-Raphson보다 나은 반복을 한 번 적용하는 방식이 제안됨
- Halley 계열과 여러 반복법은 Newton-Raphson보다 더 빠르게 수렴할 수 있지만, 실제 속도는 각 연산의 비용에 좌우됨
- 정수 전용 범위, 예를 들어
2^32라면 같은 아이디어를 고정소수점으로 적용할 수 있음- 하드웨어용 단순 방법으로 divide and conquer가 제시됨
- 각 8비트를 256개 고정소수점 값 테이블로 매핑하고 병렬 조회한 뒤, 3번의 곱셈 중 2번을 병렬로 수행해 32비트 값을 얻고 truncate할 수 있음
- sqrt 최적화 연구는 계속되고 있으며, INRIA HAL 자료가 예시로 제시됨