본문 바로가기

GPU-KERNEL

CUDA 의 fmaf(), Fused Multiply-Add (FMA) 연산 강제

fmaf() 란?

float fmaf(float x, float y, float z);
  • 계산
    • x * y + z
  • 하지만 중간 결과를 반올림하지 않고 곱 - 더하기를 한 번에 처리해서 단일 FMA 하드웨어 명령으로 수행
  • x * y 따로 하고 그 결과를 다시 z 에 더하는 것과 다르다

 

GPU 에서는?

  • CUDA 에서 fmaf() 는 거의 100% FFMA 명령으로 매핑

 

CUDA 가 자동으로 FMA 를 쓰는데, fmaf() 를 써야하는 이유

GPU 컴파일러는 보통 자동 FMA 변환을 한다.

그렇지 않는 경우도 존재

  • 복잡한 표현식
  • 메모리 load/store 섞인 경우
  • optimization level 낮을 때
  • alias 가능성 있을 때
  • IEEE strict 모드 컴파일 시 

이럴 때는 강제로 FMA 를 만들고 싶을 때 fmaf() 를 씀

 

cuBLAS 류 마이크로커널에서 fmaf() 의 명시적 사용

마이크로커널 수준에서는

  • 명령어 스케줄러가 정확히 FFMA 줄기를 만들도록 강제
  • dependency chain 을 최소화하도록 레이아웃을 짠다