본문 바로가기

GPU Probing Lab

Controlled Arithmetic Chain Probe 결과 정리 - dependent FMA vs dependent ADD 해석 검증

1. 실험 목적

이전 arithmetic_dependency_probe 에서는 다음 ordering 이 관찰

independent_fma ≈ independent_add
> dependent_fma_chain
> dependent_add_chain

문제가 된 부분은 이것

dependent_fma_chain > dependent_add_chain

fma 가 수학적으로 더 많은 일을 하는데 왜 더 높은 progress 를 보이는가

 

2. 핵심 결론

controlled_dependent_add_8 == controlled_dependent_fma_8
controlled_dependent_fma_16 < controlled_dependent_add_16

8-instruction chain 기준으로는 완전히 동일 

이 결과는 이전 해석을 강하게 보정

이전 dependent_fma_chain > dependent_add_chain 결과는
FMA가 ADD보다 본질적으로 빠르다는 뜻이 아니다.

더 가능성 높은 해석은,
이전 C++ expression 기반 workload가 최종 SASS에서
서로 다른 instruction mix와 register dependency shape를 만들었기 때문에
progress 차이가 발생했다는 것이다.

 

3. 실험 조건

이번 probe 설정은 다음과 같음

probe = controlled_arithmetic_chain_probe
blocks = 1
threads_per_block = 128
warps_per_block = 4
repeat = 10
clock_budget_cycles = 10,000,000

비교한 role 은 다음 네 가지

controlled_dependent_add_8
controlled_dependent_fma_8
controlled_dependent_add_16
controlled_dependent_fma_16

 

controlled_dependent_add_8 약 55,166.0 기준
controlled_dependent_fma_8 약 55,166.0 ADD8과 완전 동일
controlled_dependent_add_16 약 43,769.3 ADD8보다 크게 낮음
controlled_dependent_fma_16 약 42,983.4 ADD16보다 약간 낮음
FMA8 / ADD8   = 100.0%
FMA16 / ADD16 = 약 98.2%
ADD16 / ADD8  = 약 79.3%
FMA16 / FMA8  = 약 77.9%

 

4. SASS 확인 결과

4.1 FMA 8 -chain

다음의 형태로 lowering

FFMA R14, R2, R14, R7
FFMA R14, R2, R14, R7
FFMA R14, R2, R14, R7
FFMA R14, R2, R14, R7
...

실제로 0x0270~0x02e0 구간에서 FFMA R14, R2, R14, R7이 8회 반복되는 것으로 확인되었다.

데이터 흐름

R14 -> R14 -> R14 -> R14

명확한 single-accumulator chain

4.2 ADD 8-chain

FADD R14, R7, R14
FADD R14, R7, R14
FADD R14, R7, R14
FADD R14, R7, R14
...

동일 형태

 

5. 8-chain 결과의 의미

이전 실험에서는 SASS shape 가 달랐음

이전 dependent ADD:
  R14 단일 FADD chain

이전 dependent FMA:
  R14/R15를 오가는 FFMA chain
  + MOV/source setup
  + 다른 instruction spacing

이번에는 동일

FMA가 ADD보다 본질적으로 빠른 것이 아니다.
동일한 single-accumulator dependency chain으로 맞추면,
8-chain에서는 ADD와 FMA progress가 동일하게 나온다.

 

6. 이전 실험 해석 수정

이전 문서에서 다음 표현은 조심해야 한다.

dependent FMA가 dependent ADD보다 progress가 높았다.
 

이 자체는 관찰값으로 맞다.

하지만 다음처럼 쓰면 안 된다.

FMA가 ADD보다 빠르다.
FFMA latency가 FADD latency보다 낮다.
 

이번 controlled probe를 반영하면 정확한 해석은 다음이다.

이전 arithmetic_dependency_probe에서 dependent_fma_chain이 dependent_add_chain보다 높게 나온 것은,
FMA와 ADD의 순수 latency 차이라기보다,
C++ expression 기반 workload가 최종 SASS에서 서로 다른 effective instruction stream을 만들었기 때문으로 보는 것이 더 타당하다.
 

문서에는 이렇게 추가하면 좋다.

Follow-up controlled probe 결과, inline PTX로 dependent ADD와 dependent FMA를 모두 single-accumulator chain 형태로 맞춘 경우 8-instruction chain에서는 두 role의 progress가 동일하게 나타났다.

따라서 기존 probe에서 dependent_fma_chain이 dependent_add_chain보다 높게 관찰된 결과는 FMA가 ADD보다 

 

7. 16-chain 결과 해석

16-chain에서는 다음 결과가 나왔다.

controlled_dependent_add_16  ≈ 43,769
controlled_dependent_fma_16  ≈ 42,983
 

즉 FMA16이 ADD16보다 약 1.8% 낮다.

하지만 이 결과도 순수 latency 차이로 바로 해석하면 안 된다.

SASS를 보면 16-chain은 완전히 단순한 R14 -> R14 반복만으로 유지된 것이 아니라, 일부 구간에서 R10을 거치는 형태가 보인다.

FMA16 쪽은 예를 들어 다음과 같은 형태가 나타난다.

 
FFMA R10, R2, R14, R7
FFMA R10, R2, R10, R7
...
FFMA R14, R2, R10, R7
 

ADD16 쪽도 유사하게 R10을 거친다.

 
FADD R10, R7, R14
FADD R10, R7, R10
...
FADD R14, R7, R10
 

따라서 16-chain의 1~2% 차이는 이렇게 해석하는 게 안전하다.

16-chain에서는 ptxas가 긴 asm sequence를 register allocation 과정에서 R14/R10 구간으로 나누었다.
따라서 ADD16과 FMA16의 작은 차이를 순수 latency 차이로 단정하기 어렵다.
 

하지만 여기서 더 중요한 결론은 따로 있다.

chain 길이를 8에서 16으로 늘리면 progress가 크게 감소한다.
 

이건 dependency chain 길이 증가가 warp progress를 강하게 낮춘다는 증거로 사용할 수 있다.

 

8. 실험 결과의 의미

이번 controlled probe는 이전 실험의 해석 경계를 명확하게 잡아준다.

8.1 검증된 것

1. dependent ADD와 dependent FMA를 동일한 R14 single-accumulator chain에 가깝게 맞추면,
   8-chain에서는 progress가 동일하다.

2. 이전 dependent_fma_chain > dependent_add_chain 결과는
   FMA의 본질적 우위로 보기 어렵다.

3. C++ expression 기반 kernel은 최종 SASS에서
   예상보다 다른 register flow, MOV/source setup, instruction mix를 만들 수 있다.

4. 따라서 GPU probing에서는 SASS validation이 필수다.
 

8.2 여전히 조심해야 할 것

1. 이번 결과도 absolute latency benchmark는 아니다.
2. clock budget 기반 progress signature다.
3. 16-chain은 ptxas register allocation 영향이 섞여 있다.
4. FFMA latency와 FADD latency를 수치로 주장하려면 더 엄격한 latency microbenchmark가 필요하다.
 

9. Codegen 관점의 결론

이번 실험은 codegen cost model에 중요한 교훈을 준다.

단순한 모델은 다음처럼 생각하기 쉽다.

FADD cost < FFMA cost
 

하지만 이번 결과는 더 복잡한 현실을 보여준다.

동일한 single-accumulator dependency chain으로 맞춘 8-chain에서는:

FADD progress == FFMA progress
 

였다.

따라서 codegen에서는 연산 종류만 볼 게 아니라 다음 요소를 함께 봐야 한다.

- dependency chain length
- accumulator 분산 여부
- SASS에서 실제 register dependency가 유지되는 방식
- ptxas register allocation 결과
- source setup / MOV / instruction mix
- scheduler가 볼 수 있는 ready instruction 수
 

더 현실적인 cost model은 다음에 가깝다.

cost =
  operation cost
+ dependency_chain_penalty
+ SASS_shape_penalty
- ILP_exposure_bonus
+ register_pressure_penalty
 

이번 controlled probe는 특히 이 문장을 뒷받침한다.

연산 종류보다 dependency shape와 최종 SASS shape가 progress signature에 더 직접적인 영향을 줄 수 있