1. 배경
기존 AICF 구조에서는
- OpKind (문자열)
- kind_id, attr_schema, attr_blob (백엔드 실행 정보)
만 존재,
연산의 성격은 Optimizer 단계에서 kind 이름 기반으로 판별하거나 하드코딩 조건문으로 분기해야 했음
이 방식은
- 연산 이름에 의존하는 취약한 설계
- 새 Op 추가 시 Pass 코드 수정 필요
- Fusion 정책이 문자열 기반 분기 로직에 종속됨
- IR 레벨에서 연산 분류 체계가 존재하지 않음
2. 변경 목적
Emitter 단계에서 연산의 정적 본질을 비트마스크로 IR 노드에 직접 각인한다
이를 통해
- 문자열 분기 제거
- Pass 단계 단순화
- Fusion 조건을 수학적 판정식으로 정의 가능
- 확장성 확보
3. 설계 개요
Flag 계층 구조
0 ~ 15 bit : Static Flags (Emitter가 설정)
16 ~ 31 bit : Derived Flags (Pass가 설정)
4. OpFlags 정의
class OpFlags:
NONE = 0
# --- Static Flags ---
IS_GEMM_LIKE = 1 << 0
IS_ELEMENTWISE = 1 << 1
IS_REDUCE = 1 << 2
IS_OPTIMIZER = 1 << 3
HAS_STATE = 1 << 4
TERMINAL = 1 << 5
INPLACE_PREF = 1 << 6
# --- Derived Flags ---
SAFE_NODE = 1 << 16
FUSION_BARRIER = 1 << 17
DTYPE_F32 = 1 << 18
5. emit_resolved 변경 사항
신규 인자
static_flags: int = OpFlags.NONE
신규 필드 주입
op.static_flags = int(static_flags)
op.derived_flags = 0
전체 구조 요약
- Builder.emit()
- backend 실행 정보 주입
- static_flags 각인
- derived_flags 초기화
6. Static vs Derived 분리 이유
| Static Flags | Emitter | 연산의 본질 (변하지 않음) |
| Derived Flags | Pass | 그래프 맥락에 따라 변함 |
- GEMM 은 항상 IS_GEMM_LIKE
- 하지만 SAFE_NODE 는 그래프 연결 구조에 따라 달라짐
7. 사용 예시
GEMM
static_flags = OpFlags.IS_GEMM_LIKE
Add
static_flags = OpFlags.IS_ELEMENTWISE
AdamStep
static_flags = (
OpFlags.IS_OPTIMIZER |
OpFlags.HAS_STATE |
OpFlags.INPLACE_PREF
)
8. Fusion 판정 예시
문자열 비교가 아닌 다음과 같이 가능
if (
(op.static_flags & OpFlags.IS_GEMM_LIKE) and
(next_op.static_flags & OpFlags.IS_ELEMENTWISE) and
not (op.derived_flags & OpFlags.FUSION_BARRIER)
):
fuse(op, next_op)
'AI Compiler framework' 카테고리의 다른 글
| AICF V2: Bit-Pattern Driven Graph Fusion & Composite Autograd System (0) | 2026.03.01 |
|---|---|
| GEMM Epilogue (Gemm + Bias (+ReLU)) 반영 및 수정 문서 (0) | 2026.02.28 |
| Rich Matrix Optimizer Fusion 현 방식 요약 + 개선 로드맵 (0) | 2026.02.26 |
| AICF Rich-Matirx Fusion Compile Pipeline ( Concept & Rules ) (0) | 2026.02.25 |
| AICF Rich Feature Matrix Specification - 연결 그래프에 비트 표현을 통한 각 operator 정보 표현 (0) | 2026.02.25 |