본 모듈은 NCHW 레이아웃에서 동작하는 Conv2D의 Forward / Backward(dX, dW) 커널과 런처를 제공합니다. (Bias/Activation은 별도 모듈)
1. 목적/책임
- Forward: Y = conv2d(X, W; stride, padding)
- Backward‑Input: dX = dY * W^T (수학적으로 correlation)
- Backward‑Weight: dW = X ⊗ dY (입력/출력 위치에 대한 합)
- 데이터 레이아웃: NCHW
- X: [N, Cin, Hin, Win]
- W: [Cout, Cin, Kh, Kw]
- Y: [N, Cout, Hout, Wout]
Bias 추가와 활성화(예: ReLU, GELU)는 bias/, activation/ 모듈을 사용해 별도 연산으로 연결합니다. (fuse는 이후 TODO)
3. 출력 크기 공식
- Hout = floor((Hin + 2*Ph - Kh)/Sh) + 1
- Wout = floor((Win + 2*Pw - Kw)/Sw) + 1
- SAME 패딩의 일반적 가정: Ph = ⌊Kh/2⌋, Pw = ⌊Kw/2⌋ (대칭)
4. 인덱싱(핵심 포인트)
- Forward: (n, oc, oh, ow)에 대해 ic, kh, kw 합산
- 입력 좌표: h = oh*Sh - Ph + kh, w = ow*Sw - Pw + kw
- 경계 밖은 건너뜀(unsigned 비교)
- dX: (n, ic, h, w)에 대해 oc, kh, kw 합산
- oh = (h + Ph - kh), ow = (w + Pw - kw)
- stride 정합: if (oh % Sh != 0) continue; → oh/=Sh 후 범위 검사
- dW: (oc, ic, kh, kw)마다 n, oh, ow 합산
음수 인덱스 처리: dX에서 oh/ow가 음수일 수 있으므로 %// 사용 후 범위 검사 전에 조기 continue. 현재 커널은 그 패턴을 따릅니다.
5. 프레임워크 연결 (Per‑Sample Shape 규칙)
- 내부 표현은 Conv 출력이 (filters, Hout*Wout) 행렬일 수 있으나,
- 공식 출력은 보통 Flatten 레이어로 (1, filters*Hout*Wout)로 변환하여 Dense와 연결합니다.
- to_e_matrix()에서 Shape 등록 예:
- input_id → Shape(1, Cin*Hin*Win)
- conv_out → Shape(filters, Hout*Wout)
- output_id → Shape(filters, Hout*Wout) (Conv 자체는 그대로 내보내고, 별도 Flatten에서 (1, FHW))
- Bias는 (1, filters) 또는 타일된 (1, F*Hout*Wout) (브로드캐스트 지원 여부에 따라 선택).
'dev_AI_framework' 카테고리의 다른 글
| RNN 추가 - OpStruct 벡터 API 로 확장 + 레거시 호환ㅂ (3) | 2025.08.25 |
|---|---|
| optimizer — SGD / Momentum / Adam (CUDA) (0) | 2025.08.23 |
| bias — Row/Col-wise Bias Add Kernels (0) | 2025.08.23 |
| activation - CUDA 활성화 커널 모듈 (2) | 2025.08.23 |
| Per‑Sample Shape 규칙 가이드 (GE Backend) (0) | 2025.08.23 |