본문 바로가기

GPU Probing Lab

10. Chain 7 Tail Distribution Probe

 

10.1 목적

Chain 7 Tail Distribution Probe는 앞선 Irregular FMA Dependency Shape Probe에서 관찰된 chain_7 역전을 분해하기 위해 설계되었다.

앞선 결과에서 핵심 anomaly는 다음이었다.

dependent_fma_chain_7   > independent_fma_7

일반적으로는 dependent single-chain이 더 낮은 progress를 보이는 것이 자연스럽다. 그러나 chain 7에서는 independent 4acc variant가 dependent보다 낮게 나왔다. 따라서 이 후속 probe의 목적은 다음을 분리하는 것이다.

chain_7 역전이 dependency 분산 자체의 실패인가?
아니면 4acc tail distribution / live accumulator 증가 / SASS register shape의 문제인가?

10.2 실험 설정

이번 probe 설정은 다음과 같다.

probe chain7_tail_distribution_probe
threads_per_block 256
warps_per_block 8
repeat 10
clock_budget_cycles 10,000,000
focus chain 7의 accumulator 분산 방식 비교

비교한 variant는 다음이다.

dependent_fma_7 single accumulator dependent chain
independent_fma_7_2acc_4_3 2 accumulator split, 4/3 distribution
independent_fma_7_3acc_3_2_2 3 accumulator split, 3/2/2 distribution
independent_fma_7_4acc_tail_a3_missing 4 accumulator split, one tail missing
independent_fma_7_4acc_tail_a0_missing 4 accumulator split, tail position changed
independent_fma_7_7acc_once 7 accumulator, each updated once
dependent_fma_8 reference
independent_fma_8_4acc_balanced balanced 4acc reference

10.3 평균 progress

role평균 progressdependent_fma_7 대비

dependent_fma_7 53,432.1 100.0%
independent_fma_7_2acc_4_3 57,321.8 +7.28%
independent_fma_7_3acc_3_2_2 54,855.8 +2.66%
independent_fma_7_4acc_tail_a3_missing 47,372.1 -11.34%
independent_fma_7_4acc_tail_a0_missing 44,225.5 -17.23%
independent_fma_7_7acc_once 40,877.9 -23.50%
dependent_fma_8 34,586.7 reference
independent_fma_8_4acc_balanced 38,119.3 dependent_8 대비 약 +10.2%

핵심 패턴은 다음이다.

2acc independent_7 > dependent_fma_7
3acc independent_7 > dependent_fma_7
4acc independent_7 < dependent_fma_7
7acc independent_7 << dependent_fma_7

따라서 chain 7 역전은 “dependency를 분산하면 느려진다”가 아니다.

더 정확한 해석은 다음이다.

chain 7에서는 dependency 분산 자체는 유효하다. 다만 accumulator를 너무 많이 벌리거나 4acc tail 구조를 만들면 live range, register allocation, sink/reduction path 비용이 ILP 이득을 상쇄하거나 역전시킨다.


10.4 관찰 1: 2acc가 가장 좋다

dependent_fma_7              ≈ 53,432
independent_fma_7_2acc_4_3   ≈ 57,322

2acc variant는 dependent보다 약 7.3% 높다.

이 결과는 중요하다.

chain 7에서도 dependency 분산 자체는 효과가 있다.

따라서 앞선 independent_fma_7의 역전은 independent 구조 자체의 실패가 아니라, 특정 accumulator 분산 방식의 실패로 보는 것이 맞다.


10.5 관찰 2: 3acc도 이득이지만 2acc보다 약하다

independent_fma_7_3acc_3_2_2 ≈ 54,856

3acc variant는 dependent보다 약 2.7% 높다.

2acc보다 효과는 작지만 여전히 positive다. 이는 chain 7 길이에서는 2~3 accumulator 정도가 적정 범위일 가능성을 보여준다.

chain 7 적정 ILP exposure ≈ 2~3 accumulators

10.6 관찰 3: 4acc tail부터 역전된다

independent_fma_7_4acc_tail_a3_missing ≈ 47,372
independent_fma_7_4acc_tail_a0_missing ≈ 44,226

두 variant 모두 dependent보다 낮다.

또한 tail 위치를 바꾸는 것만으로도 차이가 발생한다.

a3_missing: 47,372
a0_missing: 44,226

같은 4acc/7-instruction 구조라도 tail 위치에 따라 약 6.6% 수준의 차이가 난다.

이것은 chain 7의 4acc independent가 단순히 accumulator 수만의 문제가 아니라, tail 위치, ptxas register allocation, SASS block shape에 민감하다는 신호다.


10.7 관찰 4: 7acc once는 최악

independent_fma_7_7acc_once ≈ 40,878

7개의 accumulator를 각각 한 번씩만 갱신하는 variant가 가장 낮았다.

이 경우 dependency는 거의 제거되지만, 대신 다음 비용이 커진다.

live accumulator 수 증가
register pressure 증가
sink reduction 비용 증가
SASS register allocation 복잡도 증가

즉, ready instruction을 많이 노출하는 것과 성능 향상은 같은 말이 아니다.


11. SASS 기반 해석

11.1 dependent_fma_7

Dependent path는 single-register chain 형태다.

FFMA R19, R15, R0,  R14
FFMA R19, R15, R19, R14
FFMA R19, R15, R19, R14
...
FFMA R0,  R15, R19, R14

이 형태는 strict dependent chain으로 보기 좋다.

11.2 2acc independent

2acc independent는 두 accumulator가 교차된다.

FFMA R19, R15, R12, R14
FFMA R11, R15, R11, R14
FFMA R19, R15, R19, R14
FFMA R11, R15, R11, R14
...

R19 계열과 R11 계열이 번갈아 진행된다. 이 구조는 dependency latency를 어느 정도 숨길 만큼의 ILP를 제공하면서도 live register 수를 과도하게 늘리지 않는다.

11.3 7acc once

7acc once는 여러 register가 넓게 살아 있는 형태다.

FFMA R12, R15, R12, R14
FFMA R11, R15, R11, R14
FFMA R10, R15, R10, R14
FFMA R8,  R15, R8,  R14
FFMA R9,  R15, R9,  R14
FFMA R2,  R15, R2,  R14
FFMA R13, R15, R13, R14

이 구조는 dependency는 거의 없지만, live value가 많고 이후 sink 계산도 커진다. 따라서 ILP 증가가 그대로 progress 증가로 이어지지 않는다.


12. chain 7 역전 원인 정리

앞선 실험의 기존 관찰은 다음이었다.

dependent_fma_chain_7 > independent_fma_7

이번 분해 결과는 다음이다.

2acc independent_7 > dependent_fma_7
3acc independent_7 > dependent_fma_7
4acc independent_7 < dependent_fma_7
7acc independent_7 << dependent_fma_7

따라서 원인은 더 좁혀진다.

chain_7에서는 dependency 분산 자체가 나쁜 것이 아니다.
4acc tail distribution과 live accumulator 증가가 만든 SASS/register shape가 불리했다.

더 직접적으로는 다음과 같다.

chain 7의 적정 ILP는 2~3 accumulator 근처로 보이며, 4 accumulator 이상에서는 tail imbalance, live range, sink/reduction 비용이 ILP 이득을 상쇄하거나 역전시킨다.


13. Codegen implication 업데이트

이 결과는 codegen heuristic을 더 구체화한다.

틀린 규칙은 다음이다.

accumulator를 많이 만들수록 좋다

실험 결과가 지지하는 규칙은 다음이다.

dependency chain을 분산하되,
chain length에 비해 accumulator 수가 과도하면
register/live-range/sink 비용 때문에 손해가 난다.

따라서 codegen heuristic은 다음 방향이 더 안전하다.

short-to-mid chain:
  2~3 partial accumulator가 유리할 수 있음

small odd tail:
  4-way split은 tail imbalance 때문에 손해 가능

large chain:
  4-way 이상 split이 유리해질 수 있음

too many accumulators:
  live range / sink overhead / register pressure 때문에 손해

이 해석은 기존 chain 29 결과와도 잘 맞는다.

chain_29에서는 4acc independent가 크게 유리했다.
chain_7에서는 4acc independent가 불리했다.

즉, 최적 accumulator 수는 고정 상수가 아니라 chain length와 instruction shape의 함수다.


14. 문서화용 결론

Chain 7 Tail Distribution Probe는 Irregular FMA Dependency Shape Probe에서 관찰된 chain 7 역전을 분해하기 위해 설계되었다.

실험 결과 chain 7에서 independent accumulator 분산 자체는 유효했다. 2-accumulator 분산은 dependent_fma_7보다 약 7.3% 높은 progress를 보였고, 3-accumulator 분산도 약 2.7% 높은 progress를 보였다.

반면 4-accumulator tail 분산은 dependent_fma_7보다 낮았고, tail 위치를 바꾸면 추가적인 차이가 발생했다. 7개의 accumulator를 각각 한 번씩 사용하는 variant는 가장 낮은 progress를 보였다.

따라서 기존 chain 7 역전은 dependency 분산 자체가 실패한 것이 아니라, 4acc tail distribution, live accumulator 수 증가, SASS register allocation, sink/reduction path 비용이 결합되어 나타난 결과로 해석하는 것이 타당하다.

이 결과는 codegen 관점에서 중요한 결론을 준다. 독립 accumulator를 늘리는 것은 항상 좋은 것이 아니며, chain length에 맞는 적정 accumulator 수를 선택해야 한다.