Altifigence Academy

7 / 20 · 개념

valid·태그·배열 비우기

값이 0인 항, 버블과 다른 작업의 토큰을 구별합니다.

토큰의 의미

전달되는 데이터는 값만 가진 버스가 아닙니다. 이 과정의 참조 토큰은 {value, valid, job, k}입니다. valid=0이면 버블입니다. valid=1이고 value=0이면 행렬에 실제로 들어 있는 0입니다. job은 작업 식별자, k는 축약 항의 번호입니다. A의 행 번호와 B의 열 번호는 배선 위치로 고정되므로 작은 배열에서는 토큰마다 i·j를 싣지 않아도 됩니다. 타일을 재사용할 때는 제어기가 현재 타일 좌표도 보관합니다.

PE는 두 입력이 유효할 때 job과 k가 같은지 먼저 검사합니다. 서로 다른 k의 곱은 그럴듯한 숫자를 만들 수 있어 최종 결과만으로 진단하기 어렵습니다. 예를 들어 A(0,1)=2와 B(0,0)=5를 곱한 10은 어떤 행렬곱 항에도 해당하지 않습니다. 올바른 쌍은 k=1의 2와 7이며 14입니다. 일치하지 않는 태그는 정상 버블로 처리해 조용히 버리기보다 검증에서 명확한 오류로 기록합니다.

항의 개수와 순서를 확인하기

작업 시작에 acc=0, count=0을 만들고 job을 설정합니다. 매칭된 쌍을 소비할 때 expected_k=count와 입력 k를 비교한 뒤 count를 하나 늘립니다. K−1 항을 소비한 에지 직후에 해당 PE의 결과가 완성됩니다. 완료는 count=K가 되는 것과 동치이며, 버블이나 pause는 count를 바꾸지 않습니다. 이 단순 제어기는 한 작업의 k항이 0,1,... 순서로 오는 것을 요구합니다. 순서가 바뀌어도 합만 맞는 설계를 허용하고 싶다면 별도의 수신 비트맵과 중복 검사가 필요합니다.

K=2에서 A(0,0)=1, B(0,0)=5를 소비하면 acc=5, count=1입니다. 다음 에지가 버블이면 두 값은 유지됩니다. 이후 k=1의 2와 7을 소비하면 acc=19, count=2, done=1입니다. 같은 k=1을 또 소비하면 count가 이미 K이므로 오류입니다. 결과를 소비자가 받아 갔다고 해서 이중 MAC이 허용되지는 않습니다.

비우기는 데이터와 제어를 함께

마지막 경계 입력을 공급했다고 배열이 비었다고 판단할 수 없습니다. 입력은 내부 전달 레지스터에 남아 오른쪽·아래쪽으로 이동하고 있습니다. 마지막 PE가 마지막 항을 소비할 때까지 invalid 경계 토큰을 공급하면서 advance를 계속해야 합니다. 이 과정을 drain이라고 부릅니다. 정상 drain에서 acc는 지우지 않으며, 결과를 읽을 때까지 유지합니다. 반대로 새 작업 시작 clear는 누산기·count·valid·태그 상태를 함께 초기화합니다.

작업 q의 내부 토큰이 남아 있을 때 q+1의 경계 토큰을 섞으면 job 태그 불일치가 생깁니다. 이 과정의 단순 래퍼는 한 작업을 완료하고 결과를 보관한 뒤 clear하여 다음 작업을 시작합니다. 작업을 겹치려면 이중 누산기, 태그별 상태 또는 출력 전송 경로까지 새로 설계해야 합니다. 태그를 추가했다고 자동으로 다중 작업 처리 능력이 생기지 않습니다.

리셋 직후 데이터 버스에 오래된 비트가 보여도 valid=0이면 계산하지 않습니다. 이 계약은 의미 없는 값이 논리적으로 무시되도록 만들지만, 여기의 초기화 모델은 학습을 위해 값까지 0으로 지웁니다. 검증에는 태그 불일치·누락 k·중복 k·clear 후 잔류 valid를 포함하고, 수치 0이 정상 항으로 카운트되는지도 검사합니다.

직접 생각해 보기

K=3인 PE가 k=0의 (2,4), 버블, k=1의 (0,9), k=2의 (−1,3)을 소비합니다. 최종 acc와 count는? 마지막 토큰의 job만 다르면 어떻게 처리해야 하나요?

해설 보기

정상 태그이면 acc=8+0−3=5, count=3이며 done입니다. 버블은 카운트를 바꾸지 않고 유효 0은 바꿉니다. job 불일치이면 마지막 곱을 더하지 않고 검증 오류를 내야 하며 성공 완료로 보고하지 않습니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.