본문 바로가기

dev_AI_framework

cnn — Conv2D CUDA Kernels (NCHW)

본 모듈은 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) (브로드캐스트 지원 여부에 따라 선택).