CUDA에서 행렬곱 연산

Mechboy·2025년 5월 25일

cuda

목록 보기
3/6

행렬 곱셈에 대한 병렬 표현방법

정방행렬 A,BRN×NA,B\in\mathbb{R}^{N\times N}를 곱하는것을 쿠다로 구현하기 이전에 병렬로 연산하는 방법에 대해서 정리를 하면 다음과 같음. 먼저 각 행렬을 p×pp\times p개의 사이즈를 가지는 부분행렬로 나눈 다음에 각각 구간의 곱을 구한다음에 합을 구하는게 병렬처리에 유리함


1. 블록 분할 형태

A=[A11A12A1pA21A22A2pAp1Ap2App],AijRm×mA = \begin{bmatrix} A_{11} & A_{12} & \cdots & A_{1p} \\ A_{21} & A_{22} & \cdots & A_{2p} \\ \vdots & \vdots & \ddots & \vdots \\ A_{p1} & A_{p2} & \cdots & A_{pp} \end{bmatrix}, \quad A_{ij}\in\mathbb{R}^{m\times m}
  • 전체 AAp×pp\times p개의 블록으로 구성
  • 각 블록 AijA_{ij}m×mm\times m 크기의 부분 정방행렬

예시: p=2p=2, m=2m=2인 경우

A=[a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44]=[[a11a12a21a22][a13a14a23a24][a31a32a41a42][a33a34a43a44]]A = \begin{bmatrix} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \end{bmatrix} = \begin{bmatrix} \begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix} & \begin{bmatrix}a_{13}&a_{14}\\a_{23}&a_{24}\end{bmatrix} \\[1em] \begin{bmatrix}a_{31}&a_{32}\\a_{41}&a_{42}\end{bmatrix} & \begin{bmatrix}a_{33}&a_{34}\\a_{43}&a_{44}\end{bmatrix} \end{bmatrix}

동일 한 형식으로 B도 표현하면 아래와같이 표현됨

A=[b11b12b13b14b21b22b23b24b31b32b33b34b41b42b43b44]=[[b11b12b21b22][b13b14b23b24][b31b32b41b42][b33b34b43b44]]A = \begin{bmatrix} b_{11} & b_{12} & b_{13} & b_{14} \\ b_{21} & b_{22} & b_{23} & b_{24} \\ b_{31} & b_{32} & b_{33} & b_{34} \\ b_{41} & b_{42} & b_{43} & b_{44} \end{bmatrix} = \begin{bmatrix} \begin{bmatrix}b_{11}&b_{12}\\b_{21}&b_{22}\end{bmatrix} & \begin{bmatrix}b_{13}&b_{14}\\b_{23}&b_{24}\end{bmatrix} \\[1em] \begin{bmatrix}b_{31}&b_{32}\\b_{41}&b_{42}\end{bmatrix} & \begin{bmatrix}b_{33}&b_{34}\\b_{43}&b_{44}\end{bmatrix} \end{bmatrix}

2. 블록 행렬곱(Block Matrix Multiplication)

두 정방행렬 A,BR(pm)×(pm)A,B\in\mathbb{R}^{(pm)\times(pm)}를 같은 방식으로 분할하면
C=ABC = A B의 각 블록도 다음과 같이 표현할 수 있음

Cij=k=1pAik  Bkj,i,j=1,,pC_{ij} = \sum_{k=1}^{p} A_{\,i k}\;B_{\,k j}, \quad i,j = 1, \dots, p

즉,

  • C11=A11B11+A12B21++A1pBp1C_{11} = A_{11}B_{11} + A_{12}B_{21} + \cdots + A_{1p}B_{p1}
  • C12=A11B12+A12B22++A1pBp2C_{12} = A_{11}B_{12} + A_{12}B_{22} + \cdots + A_{1p}B_{p2}
  • \dots
  • Cpp=Ap1B1p+Ap2B2p++AppBppC_{pp} = A_{p1}B_{1p} + A_{p2}B_{2p} + \cdots + A_{pp}B_{pp}

위 수식은 전체 행렬곱을 부분 정방행렬 간 곱과 덧셈으로 표현이 가능함. 좀더 일반적인 형태로 표현 하면 다음과같이 나타낼수 있음

Cij  =  k=1pAikBkj,i,j=1,2,,pC_{ij} \;=\; \sum_{k=1}^{p} A_{ik}\,B_{kj} \quad,\quad i,j = 1,2,\dots,p

3. CUDA 병렬연산과의 관계성

  1. 그리드(Grid) 분할

    • 전체 행렬을 p×pp\times p 그리드로 나누면 ,각 그리드 셀은 크기 m×mm\times m인 부분정방행렬(블록)으로 표현 가능
      N=p×m,A=[A11A1pAp1App],AijRm×mN = p \times m,\quad A = \begin{bmatrix} A_{11} & \cdots & A_{1p}\\ \vdots & \ddots & \vdots\\ A_{p1} & \cdots & A_{pp} \end{bmatrix},\quad A_{ij}\in\mathbb{R}^{m\times m}
  2. 블록 단위 연산

    • 각 블록 (i,j)(i,j)에 대해 독립적으로 다음 수식을 계산
      Cij  =  k=1pAik  BkjC_{ij} \;=\; \sum_{k=1}^{p} A_{ik}\,\;B_{kj}
    • 이 연산은 GPU의 각 스레드 블록이 “부분행렬 Aik\,A_{ik}·BkjB_{kj} 내적 → 합산”을 담당하도록 매핑됩니다.
  3. 병렬 처리

    • p×pp\times p 블록 모두를 병렬로 실행하여 전체 C=ABC=AB를 완성
    • 타일링(shared memory) 기법을 써서 각 블록 내에서 메모리 접근을 최적화하고, 글로벌 메모리 트래픽을 연산속도를 빠르게 구현가능
profile
imageprocessing and Data science

0개의 댓글