1 / 20 · 개념
내적을 처리 요소에 배치하기
행·열·축약 인덱스를 분리하고 작은 행렬의 결과를 직접 계산합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
먼저 계산을 고정하기
행렬곱 가속기의 출발점은 MAC 개수가 아니라 각 결과가 뜻하는 값입니다. A의 크기를 M×K, B의 크기를 K×P라 하면 C는 M×P입니다. i는 결과의 행, j는 결과의 열이고 k는 합 안에서만 움직이는 축약 인덱스입니다. 모든 인덱스는 0부터 시작합니다. 이 구분을 놓치면 B의 행을 열로 잘못 읽거나, 같은 입력을 두 번 더하는 배열을 만들기 쉽습니다.
이 과정은 출력 고정 배열을 사용합니다. 처리 요소 PE(i,j)는 한 작업 동안 C(i,j)의 부분합을 자기 누산기에 보관합니다. A(i,k)는 행을 따라 오른쪽으로, B(k,j)는 열을 따라 아래로 전달됩니다. 입력값의 재사용은 이동에서 생기지만, 계산의 의미는 위 식으로 고정됩니다. 이 단계에서는 전송 시점을 정하지 않습니다. 산술 참조와 클록 참조를 분리해야 타이밍 버그가 잘못된 행렬 인덱스 뒤에 숨지 않습니다.
손으로 만든 참조값
A=[[1,2],[3,4]], B=[[5,6],[7,8]]을 사용합니다. PE(0,1)은 A의 첫 행 [1,2]와 B의 둘째 열 [6,8]을 곱합니다. 첫 항은 1×6=6, 둘째 항은 2×8=16이며 결과는 22입니다. B의 둘째 행 [7,8]을 사용하면 23이 되므로, 그 결과가 나온다면 전치 또는 인덱스 오류를 먼저 의심합니다.
| PE | k=0 항 | k=1 항 | C |
|---|---|---|---|
| (0,0) | 1×5=5 | 2×7=14 | 19 |
| (0,1) | 1×6=6 | 2×8=16 | 22 |
| (1,0) | 3×5=15 | 4×7=28 | 43 |
| (1,1) | 3×6=18 | 4×8=32 | 50 |
따라서 결과는 [[19,22],[43,50]]입니다. K=2이면 각 PE는 정확히 두 번 누산하며 전체 배열은 8개의 유효 MAC을 수행합니다. 곱셈 한 번과 덧셈 한 번을 따로 세는 연산량 표에서는 16연산이라고 표시할 수 있습니다. 두 수치는 단위가 다르므로 보고서에 MAC 또는 산술 연산을 반드시 적습니다.
주소와 좌표를 연결하기
행 우선 메모리에서 A(i,k)의 원소 주소 오프셋은 iK+k이고 B(k,j)는 kP+j입니다. 위 B의 열 j=1은 오프셋 1과 3에서 읽습니다. 열 방향으로 공급할 데이터를 행 우선 메모리에서 읽으려면 단순 연속 읽기만으로 충분하지 않을 수 있습니다. 나중에 버퍼를 설계할 때 이 주소 규칙을 그대로 사용하고, 공급 순서는 별도로 재배열합니다.
참조 계산은 넓은 정수로 수행하고 RTL에서 정한 양자화는 마지막에 적용합니다. 작은 값만 사용하는 이 예제는 오버플로를 검증하지 않으므로, 음수·최솟값·긴 K를 별도 시험으로 추가해야 합니다. 단위행렬 B를 넣었을 때 A가 그대로 나오는지, 0행을 넣었을 때 해당 C행이 0인지도 인덱스를 확인하는 좋은 검사입니다. 정답 행렬만 비교하는 것에 더해 PE별 k 항 목록을 기록하면 누락과 중복을 바로 찾을 수 있습니다.
직접 생각해 보기
A=[[2,-1],[0,3]], B=[[4,5],[-2,1]]일 때 C와 전체 MAC 수를 구하세요. B(1,0)의 행 우선 원소 오프셋도 구하세요.
해설 보기
C(0,0)=2×4+(-1)×(-2)=10, C(0,1)=2×5+(-1)×1=9, C(1,0)=0×4+3×(-2)=-6, C(1,1)=0×5+3×1=3입니다. C=[[10,9],[-6,3]], MAC 수=2×2×2=8, B(1,0) 오프셋=1×2+0=2입니다.