시스톨릭 배열은 이론적으로 폰 노이만 구조보다 유리해야 한다. 데이터를 메모리에서 반복해서 읽는 대신 처리 소자(PE)끼리 값을 직접 넘기며 재사용하기 때문이다. 아두이노 다섯 대로 직접 만들어 재 보니, 이 예측은 절반만 맞았다.
- 같은 행렬곱 (2×K 곱 K×2)
- 단일 보드 (순차 접근)
- 2×2 격자 (시스톨릭 배열)
- 처리 시간 · 이동 횟수 비교
맞았던 절반
행렬 원소가 한 곳에서 다른 곳으로 옮겨지는 횟수를 논리적 이동 횟수로 정의하고 두 구조를 같은 기준으로 셌다. 단일 보드는 결과 원소를 계산할 때마다 필요한 값을 새로 읽어 8K회가 필요하다. 격자에서는 한 번 들어온 원소가 여러 PE를 지나며 계속 쓰여서 6K회로 충분했다.
| K | 단일 보드 | 2×2 격자 | 차이 |
|---|---|---|---|
| 2 | 16 | 12 | −25% |
| 4 | 32 | 24 | −25% |
| 6 | 48 | 36 | −25% |
| 8 | 64 | 48 | −25% |
예를 들어 PE(0,0)이 아래로 넘긴 A[1][k]는 PE(1,0)에서 한 번 쓰이고, PE(1,1)로 다시 넘어가 또 한 번 쓰인다. 같은 값을 메모리에서 다시 읽지 않는다. 데이터 재사용이 이론대로 일어났다.
틀렸던 절반
처리 시간은 완전히 반대였다.
| K | 단일 보드 (µs) | 2×2 격자 (µs) |
|---|---|---|
| 2 | 52.0 | 16,972.4 |
| 4 | 112.0 | 33,070.4 |
| 6 | 160.0 | 49,216.8 |
| 8 | 208.0 | 65,464.0 |
격자가 295~326배 느렸다. 측정값을 K에 대한 최소제곱 직선으로 근사하면 이렇다.
단일 보드: y = 25.8K + 4.0 (R² = 0.9968)
2×2 격자: y = 8,081.1K + 775.6 (R² = 0.99999)
기울기 비: 8,081.1 ÷ 25.8 = 313.2
두 직선은 K가 아무리 커져도 만나지 않는다. 기울기도 격자가 훨씬 크고 절편도 격자가 더 크기 때문이다. K를 키우면 언젠가 역전되리라 기대했지만, 이 실험 환경에는 손익분기점이 존재하지 않았다.
이론값과도 어긋났다
Raja(2024)의 공식 NC = 2·SR + SC + T − 2에 2×2 격자를 넣으면 NC = K + 4다. K = 2, 4, 6, 8에서 6, 8, 10, 12 사이클이 나와야 한다. 그런데 실측 클럭 수는 271,558~1,047,424로 네다섯 자릿수 이상 컸다. 이 공식은 PE 간 전달을 1클럭으로 가정실제 칩에서는 PE가 인접해 있어 배선 지연이 나노초 이하다. 그래서 전달 한 번이 사실상 한 클럭 안에 끝난다고 볼 수 있다.하는데, 우리 구현에서는 그 전달이 마이크로초 단위의 외부 GPIO 통신이었기 때문이다.
왜 이런 일이 생겼나: 이동 한 번의 값
이동 횟수는 25% 적은데 시간은 300배 넘게 걸리는 모순은, 이동 한 번에 드는 비용을 구하면 풀린다. 회귀식의 기울기를 K당 이동 횟수로 나눴다.
단일 보드: 25.8 ÷ 8 = 약 3.23 µs / 이동 (칩 내부 변수 접근)
2×2 격자: 8,081.1 ÷ 6 = 약 1,346.9 µs / 이동 (보드 간 GPIO 통신)
이동 한 번의 비용이 약 417배 차이 난다. 격자는 이동 횟수를 25% 줄였지만 한 번 옮길 때마다 417배를 지불하므로 전체로는 313배 손해다. 곱해 보면 0.75 × 417 ≈ 313으로 앞의 기울기 비와 맞아떨어진다.
시간이 어디에 쓰였는지도 뜯어봤다. K가 1 늘 때 추가되는 8,081.1 µs의 구성이다.
통신 4,000 µs 49.5%
스큐 대기 4,000 µs 49.5%
연산 등 81 µs 1.0%
실제 계산에 쓰인 시간은 전체의 1.0%뿐이었다. 스큐 대기는 수신 순서를 보장하려고 넣은 고정 대기인데, 연산이 전혀 없는 순수한 유휴 시간이 임계 경로의 절반을 차지했다.
결론: 원리는 맞았고 전제가 무너졌다
시스톨릭 배열이 비효율적이라는 결론이 아니다. PE 사이 전달 비용이 메모리 접근 비용보다 충분히 낮아야 이점이 성능으로 바뀐다. 이 실험은 그 전제를 핀 통신으로 무너뜨렸을 때 무슨 일이 생기는지 보여줬다. 실제 TPU가 수백×수백 개의 PE를 한 칩 안에 집적하는 이유를 거꾸로 확인한 셈이다.
이 결과를 읽을 때 조심할 것
- 대조군은 병목의 재현이 아니라 모사다. ATmega328P는 하버드 구조라, 공유 통로를 지나는 순차 접근이라는 패턴을 소프트웨어로 흉내 냈다.
- 이동 횟수 비교는 성능 지표가 아니다. 대조군의 이동은 칩 내부 변수 접근이고 격자의 이동은 외부 통신이라 같은 성질의 사건이 아니다. 데이터 재사용이라는 구조적 특성을 확인하는 용도로만 쓸 수 있다.
- 스큐는 단순화한 형태다. 한 클럭씩 어긋나게 투입하는 대신 고정 대기를 넣었다.
- 격자가 2×2로 고정돼 K만 바꿨다. 출력 행렬 크기는 변화시키지 못했다.
이 한계 때문에 300배 넘는 격차는 시스톨릭 배열 일반의 성능이 아니라, 이 구현의 성능으로 읽어야 한다. 전체 실험 설계와 원본 데이터, 참고문헌은 프로젝트 페이지에 정리해 뒀다.