Computer Architecture 6강 ~ 10강 정리
05 Jan 20206강 전력
전력
- 컴퓨터가 도착하는데에 소비되는 전기의 힘
- 전력과 클럭 속도는 밀접한 관계
- CPU 온도가 낮이지면 전력 소모 감소
- PSU(Power Supply Unit) 통해 전력 공급
클럭 속도와의 관계
- 클럭 속도가 높아지면 전력도 그에 비례하여 높아짐
- 멀티코어 프로세스가 나오면서 클럭 속도를 조금 낮추고 파이프 라인을 단순한 구조로 하여 성능을 높임
전력 사용 주 원인
- 트랜지스터가 0에서 1로 혹은 반대로 스위칭할 때 소비
- 트랜지스터가 소비하는 전력은 스위칭할 때 소모되는 에너지와 시간당 논리값이 바뀌는 빈도수의 곱
문제점
- 전압을 낮추면 트랜지스터 누설 전류 증가
- 전력이 너무 높으면 온도가 올라가 냉각 비용 발생
7강 CPU 발전 과정
발전 과정
- 단인 프로세서 ➜ 멀티 코어 프로세서
- 멀티 코어 프로세서: 여러 개의 코어를 집적한 프로세서
- 파이프 라인 구조 채택, 병렬성 상승, 처리량 최대화
Intel 8086
- 최초의 16bit 프로세서
- PC가 많이 보급되지 않아 실패
- 가성비가 떨어져 아케이드판, 콘솔 쪽에도 채용되지 못함
80386 CPU
- 386이라는 이름으로 알려짐
- 32bit 아키텍쳐로 이루어진 최초의 CPU
- PC의 보급화로 널리 사용됨
펜티엄
- 숫자 대신 최초로 이름을 가짐
- 클럭 속도: 60MHz ~ 300MHz
- 슈퍼 스칼라 아키텍쳐 사용하여 속도 높임
- 파이프 라인 2개를 사용하여 한 클럭 당 여러 명령어 수행
코어 2
- 최초 멀티 코어 프로세서
- 클럭 속도: 1GHz ~ 3.33GHz
- 코어 개수: 1, 2, 4
암달의 법칙
- 트랜지스터의 증가로 인한 성능 향상에 한계
- 코어 개수를 늘리는 방향으로 CPU 발전
- 멀티 코어가 성능이 2배가 되는 것을 의미하지 않음
- 병렬화 문제에서 기인하여 프로세서 개수만으로는 성능 향상에 한계
i3, i5, i7
- i3: 2 cores, 4 threads
- i5: 4 cores, 4 threads
- i7: 4cores, 8 threads
- hyper threading: 하나의 코어에 또 다른 가상 코어를 만들어 CPU를 2개로 인식하게 만드는 병렬화 방법
- overclock(4790K, 7800K)
- 설계됐을 때의 속도보다 강제로 더 높은 속도로 동작하게 만듦
- FSB(Front Side Bus)와 CPU 배수를 높여 안정적인 최대 운영 주파수에 다다를 때까지 높임
- 전력을 많이 소비하게 되지만 높은 사양의 소프트 웨어 사용 가능
- 발열과 하드웨어에 무리를 주게 됨
8강 명령어
정의
- 컴퓨터가 하드웨어에게 일을 시키기 위한 수단
- 하향식 접근 구조
- 다음 명령어를 가리키는 레지스터(Instruction pointer)에 따라 명령어 실행
Instruction pointer
- 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리 주소를 가리키는 상태 레지스터
- 프로그램의 실행이 진행됨에 따라 자동으로 증가
- 프로그램의 실행 순서가 변경되는 제어문이 실행될 때 자동으로 변경
- 직접 접근 불가
명령어 집합 구조(Instruction Set Architecture)
- 프로세서가 인식해서 기능을 이해하고 실행할 할 수 있는 기계어
- 명령어 집합 구조는 1대1 대응되는 어셈블리어로 표현 가능
- 명령어 집합 구조에는 MIPS, ARM, x86, RISC-V 등이 있음
명령어 집합 구조 설계
- 작성된 프로그램과 수행할 컴퓨터 하드웨어 사이의 인터페이스에 대한 완전한 정의 혹은 명세
- 하드웨어 기술이나 컴퓨터 구성, 플랫폼이 될 운영체제 등을 고려해야 하는 어려운 작업
- 연산 종류: 처리 연산, 제어 연산, 입출력 연산 등
- 데이터 형식: 데이터의 의미, 데이터 값 저장 방식(정수, 실수, 논리) 등
- 명령어 형식: 명령어 구성 부분을 나타내는 양식
- 피연산자를 위한 주소 지정 방식(Addressing mode)
- 피연산자의 위치를 명시하는 방법
- 메모리 또는 레지스터
구조
- 실행코드(opcode)와 피연산자(operand)로 구성
- 총 32bit로 8bit 블럭 4개로 구성
- 첫 4bit는 실행코드, 나머지는 피연산자
9강 하드웨어 연산
산술연산
- 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙 연산
- 컴퓨터는 레지스터와 ALU를 통해 산술연산 수행
MIPS 산술 명령어
- 반드시 한 종류의 연산만 지시
- 항상 변수 3개를 가짐
- 간단하게 설계하기 위해서는 규칙적인 것이 좋으므로 피연산자는 항상 3개
MIPS 산술 명령어를 통해 b, c, d, e의 합을 a에 넣는 경우 1) b와 c를 더하여 a에 저장 add a, b, c 2) a와 d를 더하여 a에 저장 add a, a, d 3) a와 e를 더하여 a에 저장 add a, a, e
MIPS 레지스터
- 연산을 위해 MIPS 명령어 구조에서 제공하는 레지스터
- 컴퓨터가 사용하는 변수 역할
스택 프레임
- 함수가 실행될 때마다 자신만의 고유한 stack 영역 가짐
- 함수의 스택 프레임 시작점은 fp가 가리킴
- 함수의 종료시에 해제되고 리턴 주소로 복귀
고급 언어와의 관계
- 변수는 s 레지스터에 저장
- A ~ E는 $s1 ~ $s5에 저장되어 있다고 가정
A = B + C;
D = A - E;
add $s1, $s2, $s3
sub $s4, $s1, $s5
10강 피연산자
피연산자
- 연산자에 정의된 연산을 하기 위해 사용되는 레지스터나 상수, 레이블, 메모리 주소
- 레지스터는 데이터를 저장하는 장치 중 속도가 가장 빠른 장소이므로 일부 레지스터만 사용 가능
- 더 적은 레지스터를 필요로 하는 순서로 연산을 함으로써 더 많은 피연산자를 레지스터에 할당할 수 있게 됨
데이터 단위
- MIPS 명령어 및 레지스터는 32 bit로 구성
데이터 단위 | 크기 |
---|---|
word | 32 bit |
half word | 16 bit |
byte | 8 bit |
메모리 피연산자
- 프로그래밍 언어에는 단순 변수가 아닌 자료형 존재(ex. 구조체, 배열)
- 레지스터는 소량의 데이터만 저장할 수 있으므로 나머지 데이터는 메모리(heap-동적으로 할당, stack-정적으로 할당)에 저장 후 주소에 접근하여 사용
- 메모리와 레지스터간 데이터를 주고받는 명령어를 데이터 전송 명령어(Data Transfer Instruction)이라 함
적재 명령어
- 메모리에서 레지스터로 데이터를 복사하는 데이터 명령어
- 메모리는 주소가 인덱스의 역할을 하는 일차원 구조
- 연산자(lw) + 값을 저장할 레지스터 + 메모리 접근에 사용할 상수 및 레지스터로 구성
MIPS 명령어로 치환하기 1) g, h는 각각 $s1, $s2에 할당 2) 배열 A의 시작주소는 $s3에 할당 g = h + A[1]; lw $t0, 4($s3) # $t0 = Memory[$s3 + 4] add $s1, $s2, $t0 # $s1 = $s2 + $t0 - 데이터 전송 명령어 상수 부분(4)를 offset이라 함 - 자료구조의 시작 주소를 가리키는 레지스터를 bare register라 함 - MIPS에서 시작 주소는 항상 4의 배수여야 함(정렬 제약)
저장 명령어
- 적재와 반대로 레지스터에서 메모리로 데이터를 보내는 명령어
- 적재 명령어와 같은 구조
- 연산자(sw) + 저장할 데이터를 가진 레지스터 + 메모리 주소 레지스터 및 상수(offset)로 구성
MIPS 명령어를 C언어로 치환하기 1) h는 $s1에 할당 2) 배열 A의 시작 주소는 $s3에 할당 lw $t0, 8($s3) add $t0, $s1, $t0 sw $t0, 32($s3) A[8] = h + A[2] - 배열 A의 인덱스 2에 접근하기 위해 2*4 = 8을 $S3에 더함 ➜ 8($s3) - 배열 A의 인덱스 2의 값을 임시 레지스터 $t0에 저장 ➜ lw $t0, 8($s3) - $s1에 저장된 h의 값과 add 연산 ➜ add $t0, $s1, $t0 - sw 연산을 이용하여 A[8]에 값을 저장하기 위해 베이스 레지스터에 8*4 = 32의 값을 더함 ➜ sw $t0, 32($s3)
수치 연산
- 프로그램 연산에서 레지스터가 아닌 상수를 사용하는 경우
- 상수 필드를 갖는 산술 명령어를 사용시 메모리에서 적재하는 것보다 효율적
- 사용 빈도가 높으면 상수를 명령어에 포함하는 것이 좋음(Common case fast)
- 연산자: addi(add와 같은 구조)
MIPS 명령어로 치환하기 1) h는 $s1에 저장되어 있음 2) 배열 A의 베이스 레지스터는 $s3 A[8] = h + 10 addi $t0, $s1, 10 # $t0 = h + 10 sw $t0, 32($s3) # A[8] = $t0