13 / 20 · 개념
타일링과 경계 패딩
작은 배열에 큰 행렬을 배치하고 경계의 0과 출력 마스크를 처리합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
공간 타일을 먼저 나누기
N×N 배열보다 큰 M×P 결과는 행·열 타일로 나눕니다. 이 단원의 기본 방식은 K축 전체를 한 번에 처리하며 출력 타일마다 clear합니다. 타일 수는 ceil(M/N)×ceil(P/N)입니다. 제어기는 타일 시작 좌표 r0,c0를 보관하고, PE(i,j)를 전역 출력 C(r0+i,c0+j)에 대응시킵니다. 타일 경계에서도 로컬 i,j를 기준으로 스큐를 적용합니다.
N=2, M=P=K=3의 예를 사용합니다. A=[[1,2,3],[4,5,6],[7,8,9]], B=[[1,0,2],[0,1,0],[2,0,1]]입니다. 정확한 결과는 [[7,2,5],[16,5,14],[25,8,23]]입니다. 네 출력 타일의 시작 좌표는 (0,0),(0,2),(2,0),(2,2)입니다. 마지막 타일의 오른쪽 열과 아래 행은 실제 행렬 밖에 있습니다.
데이터 패딩과 출력 마스크
범위를 벗어난 A행과 B열은 0으로 채웁니다. 중요한 점은 이 0을 valid=1인 실제 스케줄 토큰으로 보내는 것입니다. 각 PE가 K항을 받는다는 단순 완료 계약이 그대로 유지됩니다. invalid로 처리하면 count=K에 도달하지 않는 PE가 생겨 전체 완료를 영원히 기다릴 수 있습니다. 결과 쓰기에는 별도의 output mask를 사용하여 행렬 밖 주소를 쓰지 않습니다.
마지막 (2,2) 타일의 A 입력은 [[7,8,9],[0,0,0]], B 입력은 [[2,0],[0,0],[1,0]]입니다. 출력은 [[23,0],[0,0]]이며, 왼쪽 위 23만 전역 C(2,2)에 씁니다. 0 패딩 결과를 '값이 0이니 써도 된다'고 판단하면 범위를 벗어난 메모리를 손상시킬 수 있습니다. 값과 주소 유효성은 별개입니다.
| 출력 타일 시작 | 패딩 포함 로컬 C | 실제로 쓰는 값 |
|---|---|---|
| (0,0) | [[7,2],[16,5]] | 4개 |
| (0,2) | [[5,0],[14,0]] | 2개 |
| (2,0) | [[25,8],[0,0]] | 2개 |
| (2,2) | [[23,0],[0,0]] | 1개 |
비용과 K축 타일링의 차이
각 타일은 K+2N−2=5개의 advance 에지를 사용합니다. 겹침 없이 네 타일을 계산하면 20개 계산 에지입니다. clear, 데이터 로드와 출력 전송은 별도입니다. 패딩을 포함해 4×4×3=48 MAC을 실행하지만 실제 행렬의 유용한 MAC은 3×3×3=27개입니다. 21개는 패딩된 연산입니다. 작은 경계 타일의 비용을 유용한 계산량으로 착각하지 않습니다.
K축도 나누면 같은 C를 위한 부분합을 결합해야 합니다. C(0,0)=1×1+2×0+3×2=7을 K=2+1로 나누면 첫 부분합은 1, 다음은 6입니다. 두 타일 사이에서 최종 누산기를 clear하면 6만 남습니다. 부분합을 별도 넓은 저장소에 저장해 합하거나, 같은 출력 누산기를 보존하는 제어를 설계해야 합니다. 각 부분을 양자화한 뒤 더하면 전체 합을 한 번 양자화하는 결과와 다를 수 있습니다.
이 과정의 캡스톤은 공간 타일링과 전체 K 유지부터 검증합니다. K축 재시작, bias와 출력 스케일링은 확장 과제로 계약을 추가합니다. 시험에는 1×1 결과, N의 배수 크기, 마지막 타일에 한 원소만 남는 경우와 패딩 0에 valid가 붙는 경우를 넣습니다. 참조 점수판은 전역 좌표를 키로 사용해 타일 순서 변경에도 결과가 바뀌지 않는지 검사합니다.
직접 생각해 보기
위 3×3 예제의 (0,2) 타일에서 실제 출력 마스크와 부분 결과를 쓰세요. K축을 2+1로 나눈 C(0,2)의 부분합은?
해설 보기
로컬 결과는 [[5,0],[14,0]], 마스크는 [[1,0],[1,0]]입니다. C(0,2)=1×2+2×0+3×1이므로 K 첫 2항은 2, 마지막 1항은 3, 전체는 5입니다.