Skip to the content.

FMLA, FMLS

Summary

두 녀석은 앞서 배운 FMADD와 아주 비슷해 보이지만, 소속된 부서가 다릅니다. 이 친구들은 우리가 교본 앞부분에서 마주쳤던 CMGE, DUP, EXT와 같은 SIMD(특수부대 벡터 레지스터, NEON) 소속입니다! 이름의 뒤에 붙은 LA는 Multiply-Accumulate(곱하고 누적 더하기), LS는 Multiply-Subtract(곱하고 누적 빼기)의 약자입니다. 대량의 실수 데이터를 동시에 곱하고 더하는 마법의 특공대원들이죠.


FMLA

Floating-point Multiply-Accumulate (벡터 곱하고 더하기)

⚙️ 작동 방식 시각화 (2D/3D 그래픽 및 행렬 연산의 핵)

예를 들어 FMLA V0.4S, V1.4S, V2.4S 라는 명령어를 내렸다고 가정해 봅시다. (4S 포맷이므로 32비트 실수 4개씩 동시에 연산합니다.) CPU 내부에서는 단 1 사이클 만에 다음과 같은 거대한 병렬 공장이 돌아갑니다.

[V1 레지스터] : [ A1 ] , [ A2 ] , [ A3 ] , [ A4 ] ✖️ ✖️ ✖️ ✖️ (동시에 곱하기) [V2 레지스터] : [ B1 ] , [ B2 ] , [ B3 ] , [ B4 ] ⬇️ ⬇️ ⬇️ ⬇️ [곱한 결과] : [A1B1], [A2B2], [A3B3], [A4B4] ➕ ➕ ➕ ➕ (쉬지 않고 기존 값에 누적 더하기) [기존 V0 변수] : [ C1 ] , [ C2 ] , [ C3 ] , [ C4 ]


[최종 V0 변수] : [A1B1+C1], [A2B2+C2], [A3B3+C3], [A4B4+C4]

앞서 배운 FMADD가 낱개 레지스터 하나(S나 D)를 가지고 외롭게 AB+C를 했다면, 이 FMLA는 벡터 레지스터(V)를 타고 4개, 혹은 8개의 AB+C 연산을 한 번에 쓸어 담아 버리는 녀석입니다. 3D 게임 화면에서 수백만 개의 정점(Vertex) 좌표를 변환하거나, 딥러닝에서 대규모 행렬을 곱할 때 이 명령어 레일이 그야말로 불타오르게 돌아갑니다.


FMLS

Floating-point Multiply-Subtract (벡터 곱하고 빼기)

💡 왜 더하기 말고 ‘빼기’가 따로 존재할까요?

수학이나 물리 엔진, 신호 처리 알고리즘을 짜다 보면 AB + C 만큼이나 C - (AB) 형태의 수식도 쉴 새 없이 등장합니다. (예: 오차율 계산, 감쇠 진동 물리 법칙, 벡터의 거리를 구할 때 등) 만약 FMLS가 없다면 컴퓨터는 곱한 뒤에 부호를 바꾸고 다시 더하는 등 쓸데없는 코드를 여러 줄 더 써야 합니다. 하드웨어 엔지니어들은 “어차피 덧셈기 뒤에 빼기 회로 하나만 스위치로 달아두면 한 줄로 끝나잖아!” 하고 FMLS를 세트로 선물해 준 것입니다. 이 역시 흐름을 끊지 않는 가성비 극대화의 철학이죠!


🔄 혼동 방지! 가장 헷갈려하는 FMADD vs FMLA 전격 비교

어셈블리 코드를 분석할 때 이름이 비슷해서 100% 헷갈려하는 포인트가 바로 이 부분입니다.


🧱 SIMD 누적 연산 완결 판넬

복잡한 멀티미디어 가속 명령어를 한눈에 관통할 수 있도록 정갈하게 요약해 드립니다!

니모닉 쉽게 이해하는 이름 소속 레지스터 (무대) 연산 메커니즘 (동작) 주요 마법 (용도)
FMLA 벡터 곱하고 더하기 SIMD 벡터 레지스터 (V) $Vd = Vd + (Vn \times Vm)$ 3D 그래픽스 좌표 변환, AI 딥러닝 대규모 행렬 곱 가속
FMLS 벡터 곱하고 빼기 SIMD 벡터 레지스터 (V) $Vd = Vd - (Vn \times Vm)$ 물리 엔진 알고리즘, 오차율 및 디지털 신호 처리(DSP) 가속