아키텍처 별 특징과 폰노이만 병목에 발생하는 트래픽 정리
폰노이만 병목은 CPU와 메모리 사이에서 데이터가 이동하는 과정에서 발생한다. 즉, 명령어를 실행할 때마다 발생하는 메모리 트래픽에 의해 폰노이만 병목이 결정된다. 이는 곧 컴퓨터의 성능을 크게 좌우하게 되는데, 아키텍처에 따라 메모리 트래픽이 어떻게 계산되는지 정리해보았다.
비교할 아키텍처
- 메모리-메모리 컴퓨터
- 누산기 컴퓨터
- 스택 컴퓨터
- 범용 레지스터 컴퓨터
아키텍처 별 특징
1) 메모리-메모리 컴퓨터
- CPU 내부에 기억장치가 없는 컴퓨터
- 레지스터가 없기에 모든 데이터가 메모리에서 전송된다.
- 데이터가 필요할 때 명령어의 피연산자 필드에 메모리 전체 주소를 명시해야 한다
- 주요 명령어
MOV
: 메모리 → CPU로 데이터가 이동
2) 누산기 컴퓨터
- 메모리-메모리에 데이터를 저장하기 위한 하나의 레지스터(=누산기, ACC)를 추가한 것이 누산기 컴퓨터
- 피연산자가 하나인 1-주소 명령어를 사용한다.
- 누산기를 묵시적 피연산자로 사용한다. 유일한 피연산자이므로 명시할 필요가 없기 때문이다.
- 메모리를 명시적 피연산자로 사용한다. 저장 명령일 경우 메모리가 목적지가 되지만 대부분 근원지가 된다.
- CPU 내에 기억장치가 하나의 워드 용량인 누산기만 있으면 되므로 단순하고 저렴하다.
- 주요 명령어
LDA
: 메모리 → 누산기로 데이터가 이동STA
: 누산기 → 메모리로 데이터가 이동
3) 스택 컴퓨터
- 데이터를 임시로 저장하기 위해 스택 자료구조를 사용한다.
- 피연산자가 없는 0-주소 명령어를 사용한다.
- 스택에 저장된 데이터의 위치에 따라 접근 시간이 다르다. 하위에 있는 데이터를 꺼내기 위해 상위에 있는 모든 데이터를 차례로 제거해야 하므로 접근 시간이 길다.
- 대부분의 연산은 스택 최상위, 차상위 1-2개 데이터를 피연산자로 사용한다.
- 최근 사용한 데이터를 스택 최상위에 저장한다.
- 보관할 데이터가 스택 용량을 초과하면 최하위 데이터부터 삭제해야 하므로 성능이 떨어진다.
- 주요 명령어
PUSH
: 메모리 → 스택 최상위로 데이터 이동 (누산기의 LDA 같은 역할)POP
: 스택 최상위 데이터 → 메모리로 이동 (STA 같은 역할)
4) 범용 레지스터 컴퓨터
- CPU 내부에 다수의 데이터를 임시로 저장할 범용 레지스터를 사용한다.
- 피연산자가 2개 또는 3개인 2-주소 명령어, 3-주소 명령어를 사용한다.
- 스택과 달리 모든 레지스터의 접근 시간이 동일하며, 순서와 무관하게 임의로 접근할 수 있다.
- 레지스터가 명시적 피연산자로 사용된다. 다수의 레지스터가 있기 때문에 레지스터의 주소를 명시해야 구분할 수 있기 때문이다.
- 레지스터의 주소가 메모리 주소보다 짧기 때문에 명령어의 주소가 짧아진다.
- 사용 빈도가 높은 데이터를 레지스터에 저장함으로써 데이터를 위한 트래픽이 감소한다.
- 주요 명령어
load
: 메모리 → 범용 레지스터로 데이터가 이동store
: 범용 레지스터 → 메모리로 데이터가 이동
트래픽 계산
공통으로 사용할 계산 수식은 ax^2 + bx + c
으로, 세번의 곱셈과 두번의 덧셈이 필요한 수식이다.
이때 발생하는 전체 트래픽 = 명령어를 인출하면서 발생하는 트래픽(명령어 트래픽) + 데이터가 CPU와 메모리 사이를 이동할 때 발생하는 트래픽(데이터 트래픽)
계산 과정은 다시 타이핑하기 귀찮아서 스캔한 이미지를 첨부한다. 글씨는 잘 못썼지만 알아볼수는 있다.(나만 그런가?)
공통 조건
* 계산할 수식 : ax^2 + bx + c
* 메모리 주소 : 2byte
* 데이터 크기 : 4byte
* 연산 부호(opcode) : 1byte
- 메모리-메모리 컴퓨터
- 누산기 컴퓨터
- 스택 컴퓨터
- 범용 레지스터 컴퓨터
예시로 든 수식은 간단한 연산이기에 트래픽의 차이가 크게 보이지 않지만, 실제 프로그램처럼 많은 양의 연산을 처리해야 한다면 범용 레지스터 컴퓨터가 가장 두드러지는 효율성을 보인다.
레지스터는 많을 수록 좋은 것?
범용 레지스터 컴퓨터 방식은 다른 아키텍처에 비해 트래픽을 크게 감소시킨다. 그래서 오늘날의 컴퓨터는 범용 레지스터 컴퓨터 방식을 채택하고 있다. 범용 레지스터의 수가 많으면 데이터에 대한 접근 시간과 메모리 트래픽이 줄어드는 효과가 있다. 하지만 레지스터의 개수와 성능 향상이 정비례하게 이루어지지는 않는다.
레지스터가 너무 많을 때 발생하는 문제
- 레지스터 주소가 길어져 명령어 길이가 길어진다.
- 컴파일러가 모든 레지스터를 효율적으로 이용하기 어렵다.
- 문맥 교환(CPU를 사용중인 프로세스가 다른 프로세스도 CPU를 사용할 수 있도록 자신의 상태를 메모리에 모관하고 새로운 프로세스를 적재하는 작업) 비용이 증가한다.
- 레지스터 개수에 따라 하드웨어 비용이 증가한다.
레지스터가 무작정 많다고 좋은게 아니므로 개수를 적절하게 조절하는 것이 중요하다.
참고자료
컴퓨터 아키텍처, 한빛미디어, 우종정
'if (study) > 기본기 수련' 카테고리의 다른 글
컴퓨터 아키텍처 1~4장 연습문제 정답과 풀이(한빛아카테미, 우종정 지음) (20) | 2019.10.22 |
---|---|
[Java/Kotlin] 빅 엔디안(Big-Endian)과 리틀 엔디안(Little-Endian) 변환 예제 (2) | 2019.10.17 |
메모리의 속성과 빅 엔디안(Big-Endian), 리틀 엔디안(Little-Endian) 정리 (1) | 2019.10.16 |