FMLA, FMLS
Summary
두 녀석은 앞서 배운 FMADD와 아주 비슷해 보이지만, 소속된 부서가 다릅니다. 이 친구들은 우리가 교본 앞부분에서 마주쳤던 CMGE, DUP, EXT와 같은 SIMD(특수부대 벡터 레지스터, NEON) 소속입니다! 이름의 뒤에 붙은 LA는 Multiply-Accumulate(곱하고 누적 더하기), LS는 Multiply-Subtract(곱하고 누적 빼기)의 약자입니다. 대량의 실수 데이터를 동시에 곱하고 더하는 마법의 특공대원들이죠.
FMLA
Floating-point Multiply-Accumulate (벡터 곱하고 더하기)
- 이름의 풀이: Floating-point Multiply-List 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 (벡터 곱하고 빼기)
- 이름의 풀이: Floating-point Multiply-List Subtract
- 한 줄 요약: 여러 개의 실수 쌍을 동시에 곱한 뒤, 기존 벡터 레지스터의 값에서 통째로 빼버리는 명령어입니다.
- 동작 공식: V0 = V0 - (V1 * V2)
💡 왜 더하기 말고 ‘빼기’가 따로 존재할까요?
수학이나 물리 엔진, 신호 처리 알고리즘을 짜다 보면 AB + C 만큼이나 C - (AB) 형태의 수식도 쉴 새 없이 등장합니다. (예: 오차율 계산, 감쇠 진동 물리 법칙, 벡터의 거리를 구할 때 등) 만약 FMLS가 없다면 컴퓨터는 곱한 뒤에 부호를 바꾸고 다시 더하는 등 쓸데없는 코드를 여러 줄 더 써야 합니다. 하드웨어 엔지니어들은 “어차피 덧셈기 뒤에 빼기 회로 하나만 스위치로 달아두면 한 줄로 끝나잖아!” 하고 FMLS를 세트로 선물해 준 것입니다. 이 역시 흐름을 끊지 않는 가성비 극대화의 철학이죠!
🔄 혼동 방지! 가장 헷갈려하는 FMADD vs FMLA 전격 비교
어셈블리 코드를 분석할 때 이름이 비슷해서 100% 헷갈려하는 포인트가 바로 이 부분입니다.
- FMADD (일반 사무직 소속):
- 낱개의 실수 1쌍만 계산합니다. (S 레지스터 혹은 D 레지스터 사용)
- 문법 구조상 레지스터가 4개 필요합니다: FMADD S0, S1, S2, S3 ➡️ $S0 = (S1 \times S2) + S3$
- FMLA (특수부대 SIMD 소속):
- 여러 개의 실수를 한 방에 병렬 계산합니다. (V 벡터 레지스터 사용)
- 목적지 레지스터가 기존 누적값 역할까지 동시에 수행하므로 레지스터가 3개만 있으면 됩니다: FMLA V0.4S, V1.4S, V2.4S ➡️ $V0 = (V1 \times V2) + V0$
🧱 SIMD 누적 연산 완결 판넬
복잡한 멀티미디어 가속 명령어를 한눈에 관통할 수 있도록 정갈하게 요약해 드립니다!
| 니모닉 | 쉽게 이해하는 이름 | 소속 레지스터 (무대) | 연산 메커니즘 (동작) | 주요 마법 (용도) |
|---|---|---|---|---|
| FMLA | 벡터 곱하고 더하기 | SIMD 벡터 레지스터 (V) | $Vd = Vd + (Vn \times Vm)$ | 3D 그래픽스 좌표 변환, AI 딥러닝 대규모 행렬 곱 가속 |
| FMLS | 벡터 곱하고 빼기 | SIMD 벡터 레지스터 (V) | $Vd = Vd - (Vn \times Vm)$ | 물리 엔진 알고리즘, 오차율 및 디지털 신호 처리(DSP) 가속 |