Hacker News

A software thing I built: GPS on a 25MHz 486-SX

내가 만든 소프트웨어 이야기: 25MHz 486-SX 위에서 돌아간 GPS

1993년 한 임베디드 개발자가 수학 보조프로세서 없는 25MHz 486-SX, 32MB RAM 환경에서 실시간 GPS 무빙 맵 디스플레이를 구현한 회고입니다. 부동소수점 삼각함수 대신 Voronoi Cell과 8/16비트 정수 연산을 쓰는 Hipparchus 라이브러리를 활용해, 소비자용 GPS가 등장하기 5년 전에 1024x768 컬러 화면을 2초마다 갱신하는 성능을 달성했습니다.

본문

1990년대 임베디드 시스템 개발자였던 글쓴이가 VC Fed 포럼에 올린 회고로, 1993년 외주 계약으로 개발한 '실시간 GPS 기반 무빙 맵 디스플레이' 프로젝트를 소개합니다. 오늘날 우리가 휴대폰과 태블릿에서 흔히 쓰는 'GPS' 그 자체를, 하드웨어가 극도로 제한된 시대에 먼저 만들어 본 경험담입니다.

25MHz 486-SX라는 제약

요구 사양은 25MHz Intel 486-SX CPU, 32MB RAM에 소프트웨어는 ROM에 담는 것이었고, 디스플레이는 1024x768이었습니다. 문제는 486-SX가 수학 보조프로세서(FPU)가 없는 모델이라는 점이었습니다. 당시 GIS 애플리케이션용 수학 자료는 전부 부동소수점 연산과 삼각함수 공식에 크게 의존하고 있었기 때문에, 이 하드웨어에서 전통적인 방식으로는 실시간 동작이 사실상 불가능했습니다. 수학/컴퓨터 과학을 전공한 글쓴이에게 이것이 최대 난관이었습니다.

Hipparchus: 부동소수점 없는 지구 계산

해결책은 몇 달 전 Dr. Dobb's Journal에 실린 기사에서 찾았습니다. Geodesy라는 회사의 Hipparchus 라이브러리는 완전히 다른 접근을 취했는데, Voronoi Cell을 사용해 대부분의 계산을 8비트와 16비트 정수 연산으로 줄이고, 단정밀도 부동소수점 연산은 한두 번만 사용했습니다. 놀랍게도 이 방식은 확장 정밀도(Extended-precision) 부동소수점 연산보다 해상도가 더 높았다고 글쓴이는 회상합니다. 그는 기사에 실린 코드로 프로토타입을 만들어 보고 잘 동작하는 것을 확인한 뒤, 클라이언트에게 Hipparchus 라이브러리 정식 사본을 구입하게 해 완전히 작동하는 모델을 완성했습니다.

IP와 '클린룸'에 대한 아쉬움

클라이언트가 재정 문제에 부딪히면서 모든 산출물을 넘겨줘야 했고, 이후 그 프로젝트가 어떻게 됐는지는 알지 못합니다. 나중에 이 사실을 알게 된 다른 업체가 같은 것을 만들어 달라고 직접 연락해 왔지만, 그는 계약자 신분이라 IP를 소유하지 않아 거절할 수밖에 없었습니다. 그는 Phoenix Technologies가 IBM PC 클론 업체용 BIOS를 '클린룸' 방식으로 개발해 소송당하지 않았던 사례와, 1989년 Apple 대 Franklin 소송이 클린룸 접근에 유리한 판례를 남긴 사실을 언급하며, 1993년 당시 이를 알았더라면 사양서만 들고 처음부터 다시 만들 수 있었을 것이라고 아쉬워합니다.

시대를 앞선 성능

이 작업은 Garmin이나 Magellan의 소비자용 GPS가 세상에 나오기 5년 전의 일이었습니다. 당시 업계의 큰 문제는 전통적인 삼각함수 알고리즘을 돌릴 만큼 부동소수점 성능이 빠른 저가 CPU가 없었다는 점입니다. 그가 만든 장치는 1세대 소비자용 기기보다 두 배 빨랐고, 수학 보조프로세서 없이 1024x768 컬러 디스플레이를 2초마다 갱신했습니다. 초기 소비자용 GPS들이 360x240 흑백 화면이었던 것과 대조됩니다. 비슷한 성능의 소비자용 기기가 나오기까지는 무려 10년이 걸렸다고 그는 말합니다.

Hacker News 반응

  • @JPLeRouzic — 저자가 'Voronoi Cell을 사용해 대부분의 수학을 8비트와 16비트 정수 계산으로 줄이고 단정밀도 부동소수점 계산은 한두 번만 썼다'고 말하는데, 이것이 LLM 추론 속도를 높이는 데 쓸 수 있을지 궁금합니다.
  • @Neywiny — 그게 기본적으로 양자화(quantization) 같은 기법입니다. 그러니까 네, 됩니다. LLM뿐 아니라 모든 종류의 신경망에서 수년간 해오던 방식입니다.
  • @JPLeRouzic — 입문 수준의 글 링크를 제공해 주실 수 있나요?
  • @4RealFreedom — 양자화는 모델의 파라미터를 압축하는 과정에서 정밀도를 잃습니다. 제가 이 글에서 이해한 바로는 정밀도 손실이 없었다는 겁니다. '확장 정밀도 부동소수점 수학보다 해상도가 높았다'고 하니까요. 양자화의 목적은 가용 RAM에 맞게 모델을 작게 만드는 것이고, 원문 작성자가 말하는 연산 방식은 다른 문제라고 생각합니다.
  • @Neywiny — distillation과 혼동하고 계신 것 같은데, 다른 사람들이 잘못 쓰는 탓일 수도 있습니다. 부동소수점에서 고정소수점으로 바꾸는 것은 정밀도나 크기를 바꾸지 않고 표현 방식을 바꿉니다. 예를 들어 모든 값이 0~1 또는 -1~1 사이라면 표준 IEEE float의 전체 범위를 다 쓰지 못하는 것입니다. 대신 Q31 포맷을 쓰면 23비트 가수부 대신 기본적으로 31비트를 얻습니다. 따라서 사용하던 부분 범위를 더 넓은 비트 표현 범위에 펼쳐 놓을 수 있는 경우에 한해 정밀도가 증가합니다.

원문: VC Fed Forum via Hacker News / 번역·요약: Trawling