앞 장들에서 우리는 크라우니 진법의 개념을 이야기했습니다. e를 밑으로 하는 격자, 크와 카의 보폭, 음 바다. 그런데 아름다운 수학이 현실의 칩 위에서 어떻게 돌아갈 수 있을까요?
FPGA(Field Programmable Gate Array)는 하드웨어 논리를 직접 프로그래밍할 수 있는 칩입니다. 이 칩은 철저하게 0과 1, 2진법으로만 동작합니다. 크라우니 진법의 이상적인 값 e = 2.71828…을 2진법 칩 위에서 어떻게 구현할 수 있을까요?
이 장은 그 다리를 놓는 이야기입니다.
---
4상(음·옴·티·타)을 표현하려면 최소 2개의 비트가 필요합니다. 2비트로 만들 수 있는 조합이 정확히 4개이기 때문입니다.
| 2비트 | 상 | 의미 |
|---|---|---|
| 00 | 음(Um) | 기저, 잉여 흡수, 가장 낮은 에너지 상태 |
| 01 | 옴(Om) | 중립, 대기, 0의 상태 |
| 10 | 티(Ti) | 팽창, 증폭, +1 방향 |
| 11 | 타(Ta) | 수축, 감소, -1 방향 |
이 매핑은 우연이 아닙니다. 0이 두 개인 00이 기저(음)이고, 0이 하나인 01이 중립(옴)이고, 1이 하나인 10이 증폭(티)이고, 1이 두 개인 11이 감소(타)입니다. 비트의 수가 에너지의 수준과 대응합니다. 에너지가 낮을수록 0이 많고, 높을수록 1이 많습니다.
이 2비트 헤더가 모든 데이터의 첫머리에 붙습니다. FPGA는 이 두 비트를 보고 이 데이터가 어느 방향으로 어떤 역할을 해야 하는지 즉시 판단합니다. 마치 편지 봉투에 붙은 우편 분류 코드처럼, 이 2비트가 데이터의 운명을 처음부터 결정합니다.
---
FPGA에서 소수점 연산은 비쌉니다. 부동소수점 곱셈기를 만들려면 수백 개의 게이트가 필요하고, 전력도 많이 소모합니다. 크라우니 진법의 이상적인 값들은 모두 무리수입니다. e = 2.71828…, 1/e = 0.36788…. 이것들을 그대로 FPGA에 넣을 수 없습니다.
해법은 비트 시프트(Bit Shift)입니다. 2의 거듭제곱으로 분수를 만들어 소수점 연산을 덧셈과 비트 이동으로만 처리합니다.
크(Cr) Level 1의 FPGA 안착값: 2.75
이상적인 값 e ≈ 2.71828 대신, 2.75를 선언합니다.
2.75 = 2 + 1/2 + 1/4
= 10.11 (이진 소수)
= 원본값 × 2 + 원본값 >> 1 + 원본값 >> 2
즉, 어떤 값에 크를 곱하고 싶다면 그 값을 1번 왼쪽 시프트(×2)하고, 1번 오른쪽 시프트(÷2)한 값을 더하고, 2번 오른쪽 시프트(÷4)한 값을 더합니다. 3번의 비트 이동과 2번의 덧셈. 곱셈 게이트가 하나도 없습니다. 1클럭에 끝납니다.
이상적인 값과의 차이는 2.75 - 2.71828 = 0.0317...입니다. 이 차이는 음 버퍼 파생으로 자동 수렴합니다.
카(Ka) Level 1의 FPGA 안착값: 0.375
이상적인 값 1/e ≈ 0.36788 대신, 0.375를 선언합니다.
0.375 = 1/4 + 1/8
= 0.011 (이진 소수)
= 원본값 >> 2 + 원본값 >> 3
어떤 값에 카를 곱하고 싶다면 2번 오른쪽 시프트하고 3번 오른쪽 시프트한 값을 더합니다. 역시 곱셈 없이 1클럭.
이상적인 값과의 차이 0.375 - 0.36788 = 0.0071...도 음 버퍼로.
---
2.75와 0.375. 이 두 값은 FPGA 칩 위에 영구적인 하드웨어 상수로 새겨집니다.
소프트웨어처럼 실행 중에 계산하지 않습니다. 칩 설계 단계에서 이미 배선으로 결정됩니다. 이 상수들이 박힌 칩은 전원이 들어오는 순간부터, 아무 계산 없이 크와 카의 보폭을 즉시 제공할 수 있습니다.
비유하자면, 측량사가 현장에 나갈 때마다 줄자로 1미터를 재는 것이 아니라, 국제 킬로그램 원기처럼 이미 확정된 기준을 가지고 가는 것입니다. 한번 선언된 기준은 흔들리지 않습니다.
---
일반 컴퓨터의 부동소수점 연산은 정밀하지만 느리고 비쌉니다. 무엇보다, 부동소수점 연산은 예측 불가능한 오차를 만들 수 있습니다. 앞서 언급한 "0.1 + 0.2 ≠ 0.3"의 문제가 대표적입니다.
크라우니 FPGA 방식은 이 문제를 처음부터 회피합니다. 소수점이 있는 연산은 비트 시프트로 대체하고, 그 과정에서 생기는 아주 작은 오차(0.0317, 0.0071)는 처음부터 음 버퍼로 라우팅하도록 설계합니다. 이 오차가 어디로 가는지 모르는 것이 아니라, 처음부터 어디로 가는지 정해 두는 것입니다.
정밀도를 포기한 것이 아닙니다. 오차의 행선지를 설계에 포함시킨 것입니다. 이것이 크라우니 수체계가 FPGA 위에 안착하는 방식입니다.
첫 번째 책은 선물이에요. 가입하면 100맘을 드리니까, 두 번째 책부터 자유롭게 읽을 수 있어요. 친구를 추천하면 50맘도 생겨요.