아두이노로 폰 노이만 병목을 재현할 수 있을까

ATmega328P는 하버드 구조다. 칩 수준에서 폰 노이만 병목을 재현할 수 없어서, 전역 변수 하나로 공유 버스를 흉내 냈다.

2026-08-10 설계 관련 프로젝트: 폰 노이만 병목과 시스톨릭 배열 →

#시스톨릭배열#아두이노#실험설계

폰 노이만 병목과 시스톨릭 배열을 비교하려면 먼저 비교 대상이 필요하다. 시스톨릭 배열 쪽은 아두이노 네 대로 만들면 된다. 문제는 대조군이었다. 폰 노이만 구조를 어디서 구해오느냐는 문제다.

칩이 이미 다른 구조였다

실험에 쓴 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에는 반복문 제어 시간이 섞여 있다. 그래서 이 값을 실제 메모리 지연 시간과 직접 비교하면 안 된다. 이 값은 같은 실험 환경 안에서 격자의 통신 비용과 견주는 용도로만 의미가 있다.

완벽한 재현은 아니지만, 비교에 필요한 조건은 충족했다. 두 구조가 같은 행렬, 같은 연산량을 처리하고, 이동 횟수를 같은 기준으로 셀 수 있으면 된다. 재현하지 못하는 부분은 한계로 적어두는 쪽을 택했다.

이 대조군을 기준으로 시스톨릭 배열을 어떻게 구성했는지는 다음 글에서 이어진다.