이 자료를 쓰는 강의: 37 Instruction set architecture(명령어 집합 아키텍처) I
Lec2-ISA I
한국어판 강의자료 · 33쪽

p.1CSED311 컴퓨터구조 – 강의 2
- instruction set architecture (ISA)(명령어 집합 아키텍처) I
- 김광선
- 컴퓨터공학과
- POSTECH

p.2드론을 구입했다고 상상해보자
- 드론을 어떻게 조종하는지 배우려면 어떻게 해야 할까?

p.3드론 기능 사양 예시

p.4컴퓨터가 무엇을 하는지 어떻게 사양할까?
- 아키텍처(명령어 집합 아키텍처) 수준
- 자동차: 운전 매뉴얼 및 운영 매뉴얼
- // 자동차 정비사가 아니어도 자동차를 운전할 수 있음
- 컴퓨터: 명령어 집합 매뉴얼 (예: Intel x86-64, Arm v8, RISC-V)
- // 회로 설계자가 아니어도 컴퓨터를 사용할 수 있음
- 마이크로아키텍처(구현) 수준
- 특정 자동차 설계는 전기 및 기계적 구성 요소의 특정 구성
- 특정 컴퓨터 설계는 datapath(데이터 경로) 및 control logic units(제어 논리 회로)의 특정 구성
- 다수의 맥락(예: 뉴스 기사)에서 아키텍처와 microarchitecture(마이크로아키텍처)를 서로 바꿔 쓰는 경우가 많음
- 이 수업에서는 용어의 엄격한 정의를 따를 것임

p.5차량의 전송 방식 – 아키텍처 수준
- 수동 변속기
- 자동 변속기

p.6차량의 전송 방식 – microarchitecture(마이크로아키텍처) 수준
- 수동 변속기
- 자동 변속기
- 출처: DOI: 10.3844/ajeassp.2018.586.597
- 출처: https://youtu.be/Ugao6jTyM7k

p.7Intel x86 아키텍처 매뉴얼

p.8microarchitecture(마이크로아키텍처) 예시
- NVIDIA A100 GPU
- Arm Neoverse N1 코어
- 출처: https://en.wikichip.org/wiki/arm_holdings/microarchitectures/neoverse_n1
- 출처: NVIDIA

p.9컴퓨터가 무엇을 하는지 어떻게 지정할까?
- 아키텍처 (명령어 집합 아키텍처) 수준
- 자동차: 운전 매뉴얼 및 운영 매뉴얼
- ※ 자동차 정비사가 아니어도 자동차를 운전할 수 있음
- 컴퓨터: 명령어 집합 매뉴얼 (예: Intel, Arm, RISC-V)
- ※ 회로 설계자가 아니어도 컴퓨터를 사용할 수 있음
- 마이크로아키텍처 (구현) 수준
- 특정 자동차 설계는 전기적·기계적 구성 요소의 특정 구성
- 특정 컴퓨터 설계는 datapath(데이터 경로) 및 control logic units(제어 논리 회로)의 특정 구성
- 회로 (=물리적 구현) 수준
- 자동차: 금속 판, 크랭크, 샤프트, 기어 등
- 컴퓨터: 게이트, 와이어, 반도체, 트랜지스터 등

p.10저장 프로그램 (von Neumann) 아키텍처
- stored program architecture(저장 프로그램 아키텍처)
- 명령어는 선형 메모리 배열에 저장됨
- • 명령어(및 데이터)는 메모리에 있음
- • 명령어는 데이터처럼 수정될 수 있음
- • 둘 다 0과 1로 구성됨
- 순차적 명령어 처리
- 1. 프로그램 카운터 (PC)는 현재 명령어를 식별함
- 2. 명령어는 메모리에서 가져와 실행됨
- 3. program counter (PC)(프로그램 카운터)가 명령어에 따라 증가함
- 4. 반복함
- Burks, Goldstein, von Neumann, 1946년, 전자 계산 장치의 논리적 설계에 대한 초안 논의

p.11von Neumann vs. 데이터 흐름
- von Neumann: von Neumann 프로그램을 고려해보자
- 프로그램 순서의 의미는 무엇인가?
- 저장 위치의 의미는 무엇인가?
- 데이터 흐름: 명령어 순서는 데이터 흐름 의존성에 의해 지정됨 (프로그램 카운터 없음!!)
- 각 명령어는 결과를 받을 대상을 지정함
- 명령어는 모든 operand(피연산자)가 도착했을 때 '언제든지' 실행될 수 있음
- 어느 쪽이 더 나은가?
- v <= a + b;
- w <= b * 2;
- x <= v – w;
- y <= v + w;
- z <= x * y;
- +
- *2
- -
- +
- *
- b
- z
- a
- ‘von Neumann bottleneck(폰 노이만 병목)’

p.12명령어 집합 아키텍처 (ISA)
- "컴퓨터 사용자 매뉴얼"

p.13instruction set architecture (ISA)(명령어 집합 아키텍처)에서 정의/결정되는 사항은 무엇인가?
- ‘기계 수준 또는 어셈블리 프로그래머에게 제공되어야 하는 모든 정보’
- 데이터 유형
- 인코딩 및 표현 방식
- memory model(메모리 모델)
- 프로그래머가 볼 수 있는 상태
- general-purpose registers (GPR)(범용 레지스터)
- 메모리 공간
- program counter (PC)(프로그램 카운터)
- 프로세서 상태
- 명령어 집합
- 명령어 및 형식
- addressing modes(주소 지정 방식)
- 데이터 구조
- 시스템 모델
- 상태
- privilege level(권한 수준)
- interrupt(인터럽트)
- 입출력
- external interface(외부 인터페이스)
- 입출력 관리
- ‘아키텍처’라는 용어는 프로그래머가 보는 시스템의 특성, 즉 개념적 구조와 기능적 행동을 설명하기 위해 사용되며, 데이터 흐름과 제어의 구성, 논리적 설계, 물리적 구현과는 구분된다.
- --- IBM System/360 아키텍처, Amdahl, Blaauw 및 Brooks, 1964년, 1페이지 주석

p.14프로그래머가 볼 수 있는 상태
- M[0]
- M[1]
- M[2]
- M[3]
- M[4]
- M[N-1]
- 메모리
- 주소로 인덱싱된 저장 위치의 배열
- 프로그램 카운터 (32비트 ~ 64비트)
- : 현재 명령어의 메모리 주소
- 명령어(및 프로그램)는 프로그래머가 볼 수 있는 상태의 값을 변환하는 방법을 지정한다
- 32비트 ~ 64비트
- 레지스터
- - ISA에서 특별한 이름을 부여받음 (주소와는 다름)
- - general-purpose(범용) vs. special-purpose(특수 목적)

p.15일반 명령어 클래스
- 산술 및 논리 연산 (예: add, sub, and, or)
- 일반적으로 정수 및 부동소수점 명령어로 분류됨
- 1) 지정된 위치에서 operand(피연산자) 가져오기
- 2) operand(피연산자)에 대한 함수로 결과 계산하기
- 3) 결과를 지정된 위치에 저장하기
- 4) PC를 다음 순차 명령어로 업데이트하기
- 데이터 이동 연산 (예: move, load, store)
- 1) 지정된 위치에서 operand(피연산자) 가져오기
- 2) operand(피연산자) 값을 지정된 위치에 저장하기
- 3) PC를 다음 순차 명령어로 업데이트하기

p.16일반 명령어 클래스, 계속
- 제어 흐름 연산 (예: branch, jump)
- 1) 지정된 위치에서 operand(피연산자) 가져오기
- 2) branch(브랜치) 조건과 타겟 주소 계산하기
- 3) ‘branch(브랜치) 조건이 참’이면 PC ← 타겟 주소
- 그렇지 않으면 PC ← 다음 순차 명령어
- 모든 명령어는 일반적으로 atomic instruction(원자적 명령어)로 정의됨

p.17초기 instruction set architecture (ISA)(명령어 집합 아키텍처): EDSAC (1949)
- 단일 accumulator(누산기) 아키텍처, 즉 ACC ← ACC ⊕ M[n]
- A n: M[n]을 ACC에 더하기
- T n: ACC의 내용을 M[n]에 전송하고 초기화하기
- E n: ACC ≥ 0이면 M[n]으로 branch(브랜치)하거나 순차적으로 진행하기
- I n: 종이 테이프에서 다음 문자를 읽어 M[n]의 가장 낮은 5비트에 저장하기
- Z: 기계를 정지하고 경고 벨을 울리기
- 메모리 주소가 명령어에 하드코딩되어 있음 (‘n’)
- opcode(연산 코드) 5비트
- n 10비트
- 예약됨
- operand(피연산자) 크기

p.18같은 실수를 다시 하시겠습니까?
- 함수 호출
- 루프 내 배열 접근
- ......
- a:
- E n1
- ......
- ......
- b:
- E n1
- ......
- f: ......
- ......
- ......
- E n2
- ?
- ......
- a:
- ......
- A n1
- ......
- ......
- E n2
- ......
- i
- i+1
- i+2
- 어떻게 고칠 수 있나요?
- f
- n1
- n2
- a+1
- n1
- n2
- a
- ?

p.19레지스터 아키텍처의 진화
- accumulator(누산기)
- ‘덧셈 기계’ 시대의 유산
- 계산기의 ‘AC’ 버튼?
- accumulator(누산기) + address registers(주소 레지스터)
- register indirect addressing(레지스터 간접 주소 지정)이 필요함
- 초기에는 address registers(주소 레지스터)가 특수 목적 전용이었음 (즉, 간접 주소 지정용 주소를 저장하는 데만 사용됨)
- 결국 address registers(주소 레지스터)에 산술 연산이 지원됨
- general-purpose registers (GPR)(범용 레지스터)
- 모든 레지스터가 모든 목적에 적합함
- 몇 개의 레지스터에서부터 32개(RISC에서 흔함)까지, 128개(예: Intel Itanium)까지 다양함
- 어떤 요인이 변화를 이끌었는가?

p.20operand(피연산자) 출처?
- operand(피연산자)의 수
- 일항 연산
- OP in2
- (예: EDSAC)
- 이항 연산
- OP inout, in2
- (예: IBM 시스템/360)
- (메모리 절약을 위해 더 작은 인코딩에서 3개의 operand(피연산자) 사용)
- 삼항 연산
- OP out, in1, in2
- (예: MIPS)
- ALU operand(피연산자) 중 일부가 메모리에 있을 수 있는가?
- 예!
- 예: x86/VAX/‘CISC(복합 명령어 집합 컴퓨터)’
- 아니요!
- 예: MIPS/‘RISC(축소 명령어 집합 컴퓨터)’
- → ‘Load-Store architecture(로드-스토어 아키텍처)’
- 다양한 변형의 수
- 매우 적음
- 예: MIPS / RISC
- 매우 많음
- 예: x86
- 모든 것이 가능함
- 예: VAX

p.21메모리 addressing modes(주소 지정 방식)
- absolute addressing(절대 주소 지정)
- LD rt, 10000
- 주소로 즉시 값 사용
- register indirect addressing(레지스터 간접 주소 지정)
- LD rt, (rbase)
- GPR[rbase]를 주소로 사용
- displaced addressing(변위 주소 지정) 또는 based addressing(기준 주소 지정)
- LD rt, offset(rbase)
- offset + GPR[rbase]를 주소로 사용
- indexed addressing(인덱스 주소 지정)
- LD rt, (rbase, rindex)
- GPR[rbase] + GPR[rindex]를 주소로 사용
- memory indirect addressing(메모리 간접 주소 지정)
- LD rt ((rbase))
- M[GPR[rbase]]의 값을 주소로 사용
- auto Increment/Decrement(자동 증가/감소)
- LD rt, (rbase)
- GPR[rbase]를 주소로 사용하지만, 매번 GPR[rbase]를 증가 또는 감소시킴
- 기타 생각해볼 수 있는 것들……
- 표기법 사용 설명: GPR[rbase]
- 레지스터의 ID (즉, 레지스터 번호)
- 레지스터 rbase의 값

p.22VAX-11: 중년기의 instruction set architecture (ISA)(명령어 집합 아키텍처)
- 최초의 상용 32비트 컴퓨터 (DEC, 1977)
- -- 중요한 이정표로 여겨짐
- orthogonality(직교성)과 completeness(완전성)의 극치
- 위의 모든 addressing modes(주소 지정 방식)
- x {7개의 정수 형식 및 2개의 부동소수점 형식}
- x {300개 이상의 opcode(연산 코드)}
- opcode(연산 코드)의 과잉
- 2연산자 및 3연산자 버전의 ALU 연산
- INS(/REM)QUE (순환 이중 연결 리스트용)
- "polyf": 4차 다항식 평가
- variable-length encoding(가변 길이 인코딩) (1~56바이트)
- → 어떤 트레이드오프가 있는가?
- 예) addl3 r1,737(r2),(r3)[r4]
- 7바이트, 순차적 디코딩
- 이후 DEC는 Alpha라는 RISC 아키텍처로 전환함
- VAX 11/780 컴퓨터
- 출처: https://www.computerhistory.org/revolution/mainframe-computers/7/182/736

p.23RISC(축소 명령어 집합 컴퓨터)
- 간단한 연산
- 2입력, 1출력 arithmetic and logical operations(산술 및 논리 연산)
- 동일한 일을 수행하는 방법이 거의 없음
- 간단한 데이터 이동
- ALU 연산은 레지스터 간 연산 (큰 레지스터 파일 필요)
- 메모리는 오직 로드 및 스토어 명령어를 통해 접근 가능 → ‘Load-Store architecture(로드-스토어 아키텍처)’
- 간단한 branch(브랜치)
- branch(브랜치) 조건 및 타깃의 종류가 제한됨
- 간단한 instruction encoding(명령어 인코딩)
- 모든 명령어가 동일한 비트 수로 인코딩됨 (왜냐하면?)
- 형식이 매우 적음
- 예: MIPS 및 RISC-V
- 이러한 instruction set architecture (ISA)(명령어 집합 아키텍처)는 어셈블리 프로그래밍보다 컴파일된 코드를 위한 것이 목적임 (CISC와 대조)

p.24instruction set architecture (ISA)(명령어 집합 아키텍처)의 진화
- 왜 초기 instruction set architecture (ISA)(명령어 집합 아키텍처)는 그렇게 단순했는가?
- 예: EDSAC
- 기술적 한계
- 경험 부족, 사례 부족
- 왜 나중에 그렇게 복잡해졌는가?
- 예: VAX-11, x86
- 어셈블리 프로그래밍
- 메모리 크기 및 성능 부족
- microprogrammed implementation(마이크로프로그램 구현) (강의 6)
- 왜 다시 단순해졌는가?
- 예: MIPS, RISC-V, Arm
- 메모리 크기 및 속도 (캐시!) (강의 14)
- compiler(컴파일러)
- 왜 x86은 여전히 ‘정상’인가?
- 기술 vs. 경제
- 기술 vs. 심리학
- 기술 vs. 막대한 자금
- ‘The Case for the Reduced Instruction Set Computer’ 논문을 읽어보라 (Patterson and Ditzel, 1980), 더 잘 이해할 수 있음

p.25ISA를 설계해야 한다면?

p.26개방형 설계: 추론과 예측
- ‘고객의 계획과 프로그래밍에 10년간 신뢰할 수 있는 기반을 제공하며, 지속적인 실험실 개발을 가능하게 한다…’
- 보통의 수명은 15~20년이지만….
- 요소들의 ‘비동기적’ 운영
- 정확한 시간, 성능 등을 추상화하여 (1) 기술 변화와 (2) 요소 간 상대적 속도 변화를 허용
- 저장 용량, 다중 CPU, 다중 I/O 등에 대한 parameterization(파라미터화)
- instruction encoding(명령어 인코딩)에서 여유 비트를 ‘예약’하여 미래 확장 허용
- 확장 서브시스템에 대한 standard interface(표준 인터페이스) 제공
- [Amdahl, Blaauw and Brooks, 1964]

p.27일반 목적
- 일반 목적 = 다양한 도메인(예: 상업, 과학, 실시간 등)에서 ‘크고 작은, 별도의, 혼합된 응용 프로그램’에 대해 효과적인 지원
- 어떻게?
- code-independent operation(코드 독립적 연산)
- • 데이터 내 비트 패턴에 특별한 해석을 하지 않음
- 예: ASCII 문자에 특별한 의미 없음
- • 필수적인 경우를 제외하고는
- 예: 정수, 부동소수점 등
- 비트 및 데이터 엔티티에 대한 논리 조작의 완전한 일반성 지원
- 세밀한 메모리 주소 지정 가능성 (예: 바이트 주소 지정 가능성)
- [Amdahl, Blaauw and Brooks, 1964]

p.28모델 간 호환성
- 엄격한 프로그램 호환성 = ‘실행 시간에 의존하지 않는 유효한 프로그램이 구성 A에서 실행될 수 있다면, 구성 B에서도 실행될 수 있다. 단, 구성 B가 최소한 필요한 저장 용량과 최소한 필요한 I/O 장치를 포함하고 있다면…’
- 비유효 프로그램은 동일한 결과를 내야 한다는 제약 없음
- ‘비유효 프로그램’은 아키텍처 매뉴얼을 위반하는 프로그램을 의미하며, 예외를 발생시키는 프로그램을 의미하는 것은 아님
- 예외 조건은 아키텍처의 일부
- 논리적 구조 및 기능의 virtualization(가상화)를 통해
- binary compatibility(이진 호환성)의 왕: Intel x86, IBM System/360
- 소프트웨어 기반
- 성능 확장성
- [Amdahl, Blaauw and Brooks, 1964]

p.29정리: 용어 정의
- 명령어 집합 아키텍처 (ISA)
- • 프로그래머가 관찰하고 제어할 수 있는 머신의 동작
- 명령어 집합
- • 컴퓨터가 이해하는 명령어의 집합
- machine code(머신 코드)
- • 이진 형식으로 인코딩된 명령어의 모음
- • 하드웨어에 직접 소비 가능한 형태
- assembly code(어셈블리 코드)
- • ‘텍스트 형식’으로 표현된 명령어의 모음
- 예: ADD r1, r2, r3
- • 어셈블러에 의해 machine code(머신 코드)로 변환됨
- • machine code(머신 코드)와 (대략) 일대일 대응

p.30질문?
- 공지사항
- - 교재 읽기: P&H Ch. 2 및 선택적으로 Appendix D (모든 주요 ISA 요약)
- (Appendices는 이 링크에서 제공됨)
- - 논문 읽기: ‘The Case for the Reduced Instruction Set Computer’, Patterson and Ditzel, 1980
- - 교재(&논문) 독서 그룹:
- • 카메라를 켜고 마이크는 끄세요. 토론은 채팅을 이용하세요.
- • 월, 수, 금 9-10pm 및 화, 목 8-9pm
- • Zoom 링크: https://us02web.zoom.us/j/85840311354?pwd=cEdyZDJjUzJ4MlFsWnMzc041L3YwZz09
- (회의 ID: 858 4031 1354, 비밀번호: v3td8m)
- - 참고: 이 과정의 모든 독서 과제는 첫 번째 강의 노트에 제시됩니다.

p.31백업 슬라이드

p.32다양한 아키텍처의 예시
- TOS
- 프로세서
- 메모리
- ...
- ...
- 스택
- 프로세서
- 메모리
- ...
- ...
- accumulator(누산기)
- 프로세서
- 메모리
- ...
- ...
- 레지스터-메모리
- 프로세서
- 메모리
- ...
- ...
- 레지스터-레지스터

p.33C = A + B에 대한 코드 시퀀스 예시
- 스택
- accumulator(누산기)
- 레지스터-메모리
- 레지스터-레지스터
- Push A
- Push B
- Add
- Pop C
- Load A
- Add B
- Store C
- Load R1, A
- Add R3, R1, B
- Store C, R3
- Load R1, A
- Load R2, B
- Add R3, R1, R2
- Store C, R3
- 4 명령어, 3 메모리 연산
- 3 명령어, 3 메모리 연산
- 3 명령어, 3 메모리 연산
- 4 명령어, 3 메모리 연산
- TOS
- 프로세서
- 메모리
- ...
- ...
- 스택
- 프로세서
- 메모리
- ...
- ...
- accumulator(누산기)
- 프로세서
- 메모리
- ...
- ...
- 레지스터-메모리
- 프로세서
- 메모리
- ...
- ...
- 레지스터-레지스터