폰 노이만 병목과 시스톨릭 배열을 비교하려면 먼저 비교 대상이 필요하다. 시스톨릭 배열 쪽은 아두이노 네 대로 만들면 된다. 문제는 대조군이었다. 폰 노이만 구조를 어디서 구해오느냐는 문제다.
- 폰 노이만 구조가 필요함
- ATmega328P는 하버드 구조
- 칩 수준 재현 불가
- 소프트웨어로 공유 버스를 모사
칩이 이미 다른 구조였다
실험에 쓴 Arduino Nano 호환보드의 ATmega328P는 명령어 메모리와 데이터 메모리가 물리적으로 분리된 수정 하버드 구조명령어 버스와 데이터 버스를 따로 두는 구조. 폰 노이만 구조는 둘이 하나의 시스템 버스를 공유해서 동시에 지나갈 수 없다.다. 폰 노이만 병목의 핵심은 CPU와 메모리 사이의 단일 통로인데, 이 칩에는 그 통로가 애초에 없다. 그래서 하드웨어로는 병목을 그대로 재현할 수 없었다.
대신 행동 패턴을 모사했다
방법을 바꿔서, 구조 자체가 아니라 폰 노이만 구조의 핵심 동작을 소프트웨어 수준에서 흉내 냈다. 전역 변수 BUS를 하나 선언하고, 행렬 원소에 대한 모든 접근이 반드시 이 변수를 거치도록 busRead() 함수로만 읽게 했다.
volatile int BUS = 0; // 공유 버스
inline int busRead(int value) {
BUS = value; // 모든 접근은 이 통로를 경유
accessCount++;
return BUS;
}
이렇게 하면 두 가지가 해결된다. 명령어 흐름과 데이터 접근이 하나의 통로를 공유하는 동작이 재현되고, 통로를 지날 때마다 카운터가 올라가므로 접근 횟수를 정확히 셀 수 있다.
volatile을 붙인 이유도 있다. 컴파일러가 최적화 과정에서 BUS를 거치는 접근을 통째로 없애버리면 대조군이 대조군 노릇을 못 한다.
이 대조군이 말해주는 것과 못 말해주는 것
이 대조군은 폰 노이만 병목을 칩 수준에서 재현한 것이 아니다. 공유 통로를 통한 순차 접근이라는 행동 패턴을 소프트웨어로 모사한 것이다. 측정값 해석에서도 이 한계는 그대로 따라온다.
대조군의 이동 1회당 비용 3.23 µs에는 반복문 제어 시간이 섞여 있다. 그래서 이 값을 실제 메모리 지연 시간과 직접 비교하면 안 된다. 이 값은 같은 실험 환경 안에서 격자의 통신 비용과 견주는 용도로만 의미가 있다.
완벽한 재현은 아니지만, 비교에 필요한 조건은 충족했다. 두 구조가 같은 행렬, 같은 연산량을 처리하고, 이동 횟수를 같은 기준으로 셀 수 있으면 된다. 재현하지 못하는 부분은 한계로 적어두는 쪽을 택했다.
이 대조군을 기준으로 시스톨릭 배열을 어떻게 구성했는지는 다음 글에서 이어진다.