본문 바로가기

SASS_Probe

기본 연산 의미 명세 04 - Fused Multiply Add, FMA

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 구조가 있는가