dev_AI_framework

타일링 기반 행렬 곱 연산에서의 최적화 전략

명징직조지훈 2025. 5. 28. 09:06

― column 우선 연산 구조를 row-major 메모리에서 최적화하는 기법 정리

 

✅ 2. CUDA 메모리 모델과 문제점

  • CUDA에서 전통적으로 사용하는 메모리 모델은 row-major 방식입니다.
  • 하지만 행렬 곱에서는 Bk,jB_{k,j}처럼 열(column) 방향 접근이 많아, 이는 stride access가 되어 메모리 대역폭을 비효율적으로 사용하게 됩니다.

📉 문제점:

  • GPU에서 각 thread는 연속된 데이터를 읽는 것이 이상적 (coalesced access)
  • 열 방향 접근은 thread 간 분산된 메모리 접근을 유발 → 느림

 

✅ 3. 타일링(Tiling) 알고리즘

타일링은 전체 행렬을 작은 블록(타일) 단위로 나누어 연산하고, 이를 shared memory에 올려 연산을 수행하는 방식입니다.

특징:

  • 각 thread block이 한 타일의 Ci,jC_{i,j}를 계산
  • 해당 블록의 A와 B 값을 shared memory로 로딩
  • 타일 내에서 thread가 병렬적으로 연산 수행

장점:

  • 글로벌 메모리 접근을 줄이고, shared memory reuse 가능
  • 전체 메모리 접근 횟수 최소화
  • 병렬 연산 구조를 정밀하게 제어 가능

 

✅ 4. 최적화 전략: B의 column을 row처럼 읽기

전치 없이 column 방향 데이터를 row-major 환경에서 효율적으로 다루기 위해:

✔ 핵심 아이디어

  • B의 column (열) 데이터를 shared memory의 행으로 복사한다
  • 이후 각 thread는 A의 행과 B의 “가짜 행” (원래는 열)을 내적
  • 결과는 Ci,jC_{i,j}에 저장

✔ 구현 흐름

  1. 각 thread block은 A의 행과 B의 열(= B의 column)을 읽음
  2. B의 열은 shared memory에 row 형식으로 저장
  3. 내적 수행 후, C에 저장

 

✅ 5. 전통적인 전치 방식과의 차이점

항목전치 방식 (B^T)column-to-row 복사 방식
전처리 비용 B를 전치해야 함 (추가 복사) 없음 (전치 없이 shared memory에 직접 정렬)
구현 복잡도 인덱스 전환 필요 상대적으로 단순
런타임 메모리 접근 B_T[j][k] = B[k][j] B[k][j]를 직접 shared memory로 복사
성능 빠르지만 복사 비용 있음 더 빠르고 단순 (coalesced access fully 유지)

 

✅ 6. 실제 활용 예

이 방식은 다음과 같은 시스템 및 라이브러리에서 사용됩니다:

  • cuBLAS / CUTLASS: 내부적으로 column 접근 시 shared memory tile에 row로 복사
  • TensorFlow XLA / PyTorch JIT: 레이아웃 최적화 단계에서 이 전략 사용
  • Tensor Core 연산 (WMMA): row-major layout을 유지하면서 B matrix를 tile로 재정렬하여 처리