1. 연산 개요
곱셈과 덧셈을 하나의 연산으로 결합한다.
단순히 두 명령을 하나로 줄이는 것이 아닌, 부동소수점 환경에서 FMA 느 ㄴ곱셈 중간 결과를 별도로 반올림하지 않고 곱셈과 덧셈이 모든 끝난 결과를 한 번만 반올림
2. 수학적 정의
Multiply 와 Add 의 합성, 그러나 부동소수점 실행에서는 단순한 두 연산의 조합과 완전히 같은 연산으로 취급할 수 없다.
3. FMA 와 일반 Multiply-Add 의 차이
3.1 분리된 Mulitply-Add
곱셈 결과가 먼저 목표 precision 으로 반올림된다. ( 두 번의 반올림 발생 )
3.2 Fused Multiply-Add
내부의 정밀도로 유지한 상태에서 최종 결과에서만 반올림
따라서 수치 의미를 바꾸는 변환이기도 하다.
4. 입력과 출력 domain
FMA 는 일반적으로 세 입력을 가진다
다만 정수 multiply-add 와 floating-point FMA 는 수치 의미가 다르므로 구분해야 한다.
5. Scaler 와 Broadcast 형태
세 입력이 모두 같은 shape 일 필요는 없다.
6. 데이터 의존성
출력 y_i 는 같은 위치의 세 입력에 의존한다.
출력 원소 사이 의존성이 없어서 thread 단위 병렬화가 가능하다.
7. FMA 와 MAC 의 관계
Multiply-Accumulate, MAC 는 일반적으로 다음 구조를 의미
- acc = acc + a * x
FMA 는 부동소수점 MAC 를 하나의 fused 연산으로 수행할 수 있다.
- acc = fma(a, x, acc)
하지만 모든 MAC 가 반드시 IEEE 의미의 FMA 인 것은 아니다.
8. 의미 불변성
FMA 를 다른 구현으로 변환하더라도 다음 조건은 보존되어야 한다.
8.1 세 입력의 역할
a, x 는 곱셈 operand, b 는 addend
실수 수학에서는 곱셈 operand 순서를 바꿀 수 있다.
8.2 위치 대응 관계
Broadcasting 이 있다면 정확한 index mapping 을 보존해야 한다.
8.3 출력 cardinality
FMA 는 입력의 논리적 위치마다 출력 하나를 생성한다.
Accumulating FMA 에서는 여러 입력 pair 가 하나의 accumulator 로 합쳐질 수 있다.
8.4 Fused rounding 의미
정확히 FMA 의미를 요구하는 경우 중간 곱셈 결과가 별도로 반올림되어서는 안 된다.
수학적으로 같은 식과 FMA 의미를 정확히 보존하는 구현은 구분해야 한다.
9. 대수적 성질
9.1 곱셈 operand 의 교환
부동소수점에서도 두 곱셈 operand 의 순서 교환은 일반적으로 같은 exact product 를 만들기 때문에 동일한 결과를 기대할 수 있다.
9.2 분배 법칙 가능
...
9.3 Affine transform 합성
여러 FMA 를 더 적은연산으로 줄일 가능성을 제공, 하지만 부동소수점에서는 몇 가지 제한 존재
9.4 항등 형태
부동 소수점, 특수값 유의
10. FMA 의 수치적 장점
중간 곱셈 결과의 반올림 제거,
때문에 곱셈 결과와 b 가 서로 상쇄되는 상황에서 특히 유리할 수 있다.
11. SASS 에서 FMA 를 식별하는 기준
11.1 세 입력 dependency
FMA 결과는 세 source 값에 의존한다.
11.2 Multiply 와 Add 의 단일 instruction
별도의 FMUL, FADD 가 아니라 하나의 FFMA 가 나타난다.
11.3 Accumulator recurrence
Dot product 나 GEMM 에서는 destination 또는 accumulator register 가 addend 로 다시 사용될 수 있다. 이는 누산 recurrence 를 나타낸다.
11.4 Source modifier
Nagative scale 이나 subtract 형태는 source negation modifier 로 표현될 수 있다.
11.5 중간 product register 부재
분리 연산에서는 곱셈 결과를 저장하는 중간 register 가 필요할 수 있다.
12. FMA 와 Rgister Lifetime
분리 연산에서는 중간값의 lifetime 이 존재
FMA 에서는 별도의 product register 가 필요하지 않을 수 있다.
이론적으로 다음 효과
- temporary register decrease
- dependency chain shortening
- instruction num decrease
하지만 실제 register allocation 은 전체 kernel 에 의해 결정된다.
13. FMA 와 Instruction Count
명령 수는 두 개에서 하나로 줄어든다.
그러나 전체 kernel 성능에서 이 감소의 효과는 상황에 따라 다르다.
Elementwise kernel 에서는 memory traffic 이 지배적일 수 있다.
여기서 arithmetic instuction 하나를 줄이는 것보다 memory load/store 비용이 더 클 수 있다.
반면 GEMM 처럼 FMA 비주잉 매우 높은 compute bound kernel 에서는 FMA throughput 이 핵심 성능 요소가 된다.
14. FMA 와 Arithmetic Intensity
Elementwise FMA 는 산술 집약도가 낮다 ( 3 inputs, 1 output, 1 FMA )
반면 GEMM 에서는 하나의 input tile 을 여러 FMA 에 재사용한다.
따라서 arithmetic intensity 가 크게 증가한다.
15. FMA 와 Determinism
FMA contraction 여부가 달라지면 결과가 달라질 수 있다.
16. Fast-MAth 와 FMA
Fast-math 는 compiler 가 부동소수점 의미를 완화해 더 공격적인 최적화를 적용하도록 허용할 수 있다.
17. 명시적 FMA 와 암시적 FMA
명시적 FMA 는 다음 의미를 더 분명하게 한다
중간 product rounding 없이 하나의 fused operation 으로 계산
18. FMA 가 생성되지 않는 경우
- 중간 product 가 관측
- Strict rounding 의미
- Volatile or memory boundary
- Data type or instructions need surport
- Compiler option
- Expression struct
19. FMA 가 생성되어도 단일 고수준 연산은 아닐 수 있음
가능한 원본 경우의 수 존재
따라서 reverse interpretation 에선 FFMA 하나가 아니라 다음을 함께 봐야 한다
- operand 가 어디서 load
- destination 이 accumulator 로 재사용되는지
- loop 안에서 반복?
- output store 가 언제 발생?
- 같은 입력이 얼마나 재사용
- reduction 이나 matrix contraction 구조가 있는가
'SASS_Probe' 카테고리의 다른 글
| 기본 연산 의미 명세 06 - Selection (0) | 2026.06.23 |
|---|---|
| 기본 연산 의미 명세 05 - Comparison (0) | 2026.06.22 |
| 기본 연산 의미 명세 03 - Elementwise Multiply (0) | 2026.06.22 |
| 기본 연산 의미 명세 02 - Elementwise Add (0) | 2026.06.21 |
| 기본 연산 의미 명세 01 - Elementwise Map (0) | 2026.06.21 |