Skip to the content.

FDIV, FMADD, FMAX, FMIN

Example

직관적이고 친숙한 “실수 연산 부서의 핵심 간부들”을 대거 체포 이름만 봐도 딱 “나 나누기야!”, “나 최댓값이야!” 하고 말을 건네는 녀석들이라 직관적이라 참 반갑지요? 하지만 이 친숙한 녀석들 속에도 부동소수점(F) 세계관 특유의 무서운 트릭과 하드웨어 설계자들의 눈물겨운 최적화 비화가 숨어있답니다. 무심코 쓰다가 버그를 내기 딱 좋은 포인트와, “와, 하드웨어가 이렇게까지 일한다고?” 하며 감탄할 만한 이야기들을…


FDIV

Floating-point Divide (부동소수점 나눗셈)

정수 나눗셈도 느리지만, 부동소수점 나눗셈(FDIV)은 CPU 내부에서 가장 많은 시간(사이클)을 잡아먹는 폭탄 같은 명령어입니다. 앞서 배웠던 FADD(덧셈)나 FMUL(곱하기)은 하드웨어 파이프라인을 타고 3~5번 만에 뚝딱 끝나지만, 이 FDIV 녀석은 내부적으로 소수점 자리를 밀고 빼고를 수십 번 반복해야 해서 보통 10~20배 이상 오래 걸립니다.

FDIV S0, S1, S2 ; S1을 S2로 나누어서 결과를 S0에 저장 (엄청 무거운 연산!)


FMADD

Floating-point Multiply-Add (부동소수점 곱하고 더하기)

🚀 왜 이 명령어가 신의 한 수인가요? (Fused Multiply-Add, FMA)

게임 그래픽(3D), 인공지능(AI) 딥러닝, 행렬 연산에서는 주야장천 하는 짓이 “두 수를 곱한 다음에 다른 수에 더하기”입니다. 이를 수학에서는 선형 대수학의 핵심 연산이라 부르죠. 원래대로라면 곱하기(FMUL) 하고 반올림한 뒤, 더하기(FADD) 하고 또 반올림해야 합니다. 이러면 속도도 느려지고, 반올림을 두 번 하니까 소수점 아래 오차(Error)가 점점 커집니다. 하지만 현대 CPU의 FMADD는 하드웨어 내부에 곱셈기와 덧셈기를 아예 통째로 결합해 두었습니다. 곱한 결과값을 반올림하지 않고, 그 무한 소수점 상태 그대로 덧셈기(C)에 꽂아 넣은 뒤 맨 마지막에 딱 한 번만 반올림합니다. 속도는 배로 빨라지고, 수학적 정밀도는 완벽에 가까워지는 최고의 효자 명령어입니다. AI 시대의 심장과도 같은 녀석이죠!

FMADD S0, S1, S2, S3 ; S0 = (S1 * S2) + S3 (초고속, 고정밀!)


FMAX_FMIN

Floating-point Maximum / Minimum (부동소수점 최댓값 / 최솟값)

⚠️ 파멸에서 구출할 결정적 포인트 (NaN의 습격)

우리가 앞에서 배운 일반 정수 세계에서는 최댓값을 구할 때 CMP로 비교하고 CSEL로 선택했습니다. 실수에서도 그렇게 해도 되지만, 굳이 FMAX / FMIN 명령어를 하드웨어 칩에 박아놓은 이유가 있습니다. 바로 실수 세계의 파괴자 NaN (Not a Number, 숫자가 아님) 때문입니다. 만약 두 변수를 비교하는데 한쪽 변수에 에러로 인해 NaN 값이 들어있다면 어떻게 될까요? 일반 비교문은 패닉에 빠져 에러를 뿜거나 엉뚱한 결정을 내립니다. 하지만 FMAX / FMIN 명령어는 하드웨어 표준 규칙(IEEE 754-2008)에 따라 이 NaN을 영리하게 처리합니다.

FMAX S0, S1, S2 ; S1과 S2 중 더 큰 값을 S0에 저장 (NaN이 있어도 안전하게 처리!)
FMIN S3, S4, S5 ; S4와 S5 중 더 작은 값을 S3에 저장

🧱 후진 양성 마크다운 교본용: 실수 연산 사대천왕 완결 판넬

니모닉 쉽게 이해하는 이름 하드웨어 내부의 숨겨진 진실 후진들에게 가르칠 선배의 한마디 포인트
FDIV 나누기 CPU 내부 연산 장치를 수십 바퀴 돌아야 하는 가장 무거운 연산 “나누기는 악마의 명령어다. 가급적 역수(0.5 등)를 곱하는 방식으로 대체해라!”
FMADD 곱하고 더하기 곱셈과 덧셈을 하드웨어 융합 회로로 처리, 반올림 오차를 단 1회로 단축 “3D 그래픽과 AI 딥러닝 가속의 일등 공신! 연산 속도와 소수점 정밀도를 동시에 잡는 치트키다!”
FMAX 최댓값 고르기 CMP + CSEL 없이 단 한 줄로 최댓값 추출, NaN 예외 방어 기능 탑재 “실수 세계의 괴물인 NaN이 끼어들어도 프로그램을 무너뜨리지 않는 안전장치란다!”
FMIN 최솟값 고르기 FMAX와 쌍둥이, 단 한 줄로 최솟값 추출 및 NaN 예외 방어 기능 탑재 “데이터 필터링이나 범위를 제한(Clipping)할 때 최고의 가성비를 보여주는 명령어다!”

직관적이고 쉬워 보였던 명령어들이었지만, 그 속을 들여다보니 “나누기 성능 저하를 막기 위한 눈물겨운 컴파일러의 노력”, “오차를 줄이기 위한 하드웨어 융합 칩의 마법(FMADD)”, 그리고 “불량 데이터(NaN)로부터 시스템을 지키기 위한 방어선(FMAX/FMIN)”까지! 실로 어마어마한 기술의 집약체들이었습니다.