Search

컴퓨터구조 5강

Instruction Set

ISA (Instruction Set Architecture)에서의 IS
컴퓨터(or 프로세서)에서 지원하는 명령어들의 집합/목록
다른 컴퓨터(or 프로세서)는 다른 IS를 갖고있다
그렇지만 대부분의 프로세서는 많은 부분을 공통적으로 가지고 있음 = 대부분의 명령어가 비슷함
초기 컴퓨터들은 매우 단순한 IS를 갖고있었다.
간단한 명령어만 지원
이후 Complex Instruction set을 가진 CISC(복잡 명령어 집합 컴퓨터, Complex Instruction Set Computer)로 발전 (예) Intel 프로세서
그러나 그 이후 요즘은 현대의 많은 프로세서들은 simple instruction sets를 갖고 있다. ⇒ Reduced Instruction Set Computer(RISC) (예) MIPS

ISA ( Instruction Set Architecture)

ISA, or simply architecture
the abstract interface between the hardware and the lowest level software(OS)
instructions, registers, memory access, I/O를 포함하여 machine language program을 작성하는 데 필요한 모든 information을 포함
즉, 모든 information은 이를 통해 프로세서로 전달됨
identical software를 실행할 수 있는 ISA는 cost와 performance를 다양하게 하는 여러 개의 implementations가능. 즉, 고성능으로 만들수도 있고, 저가로 만들 수도 있다. 여러 조합의 cost와 performance의 implements가 가능
software 는 ISA에서 지원해주는 명령어만 사용한다면 그 하부적으로 hardware가 어떤 implementation이든 상관 없이 그 software를 실행시킬 수 있다.

ABI (Application Binary Interface)

ISA와 Operating system interface의 결합
IS의 user portion와 application programmers에 의해 사용되는 operating system interface를 결합한 것
컴퓨터 간 binary portability가 가능한지 판단하게 해준다. = 어떤 application이 있을 때 어떤 컴퓨터에서 실행될 수 있는지 없는지를 판단하기 위해 확인해야 하는 것이 ABI
(예) 어떤 프로그램이 리눅스 운영체제에서 개발이 되었다. 이 프로그램이 intel processor기반에선 실행이 되는데 ARM 프로세서 에서는 실행이 안 된다. 왜? IS가 다르기 때문!
어떤 프로그램이 실행이 되는 컴퓨터A의 ABI와 컴퓨터 B의 ABI가 같으면 컴퓨터 B에서도 이 프로그램은 실행이 된다.

The MIPS Instruction Set

MIPS (Microprocessor without Interlocked Pipeline Stages) : MIPS는 밉스 테크놀로지에서 개발한 RISC ISA이다. MIPS 디자인은 실리콘 그래픽스 사의 컴퓨터 시스템, 많은 임베디드 시스템(가전제품, network/storage 장비, 카메라, 프린터 등)과 윈도 CE 장치, 시스코 시스템즈 라우터에 사용되었다. 위키백과
요즘은 ARM프로세서 많이 사용
많은 최신 ISAs와 대부분 동일하다

Operations of the Computer Hardware

Arithmetic Operation

산술연산
Add, Subtract - Three operands
두개의 sources와 하나의 결과 (destination)
(예) add a, b, c → a gets b + c → b+c의 결과가 a에 저장
모든 arithmetric operation은 이런 구조를 갖는다. → regularity
(예)
C code :
f = (g + h) - (i + j)
Compiled MIPS code :
add t0, g, h # temp t0 = g + h
add t1, i, j # temp t1 = i + j
sub t0, t1 # f = t0 - t1
이렇게 C→compiled MIPS code 변환을 compiler가 한다.

Design Principle

1.
Simplicity favours regularity
복잡할수록 구현하기 어려운 것이 당연
간단하게 만들기 위해서는 regularity(정규성)을 주어야 한다.
간단함(Simplicity)는 고성능 저비용을 가능하게 한다.

Register Operands

Arithmetic instructions use register operands → RISC계열 프로세서에서 지원하는 방식(MIPS가 대표적 RISC)
MIPS는 32x32-bit register file을 가진다
자주 접근하는 데이터를 위해 사용됨
Numbered 0 to 31(32개니까)
32-bit data(4 byte)를 "word"라고 부른다
Assembler names
$t0, $t1, $t2, ..., $t9 for temporary values
$s0, $s1, $s2, ..., $s7 for saved variables
(예)
C code:
f = (g + h) - (i + j)
f, ..., j in $s0, ..., $s4
Compiled MIPS code:
add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1
Compiled MIPS code가 정확한 어셈블리 코드라고 할 수 있겠다. 우리가 작성한 C code가 실제로는 이렇게 변경이 되어 실행된다.

Design Principle

2.
Smaller is faster
register는 메모리 중 가장 작다. 즉, 가장 빠르다
c.f. main memory: millions of locations (기본단위가 GB registe: 1kbit)
cache(기본단위가 megabyte)라는 메모리 → 레지스터보다 조금 느림
DRAM - 보통 PC의 main memory → register나 cache보다 몇백~천배 정도 느림
hard disk, ssd 메모리 등도 register나 cache보다 천배 정도 느림

Byte Addresses

byte(8 bit)가 유용하기 때문에
대부분의 아키텍처는 메모리의 개별 바이트 주소를 지정합니다.
MIPS는 32bit Processor
Alignment restriction : 우리는 어떤 데이터나 명령어에 word단위로 접근하게 된다. 그래서 word단위로 align되게 됨. = MIPS는 모든 명령어가 32 bit이므로 32bit으로 align

Big/Little Endian

데이터를 메모리에 저장하는 방식의 큰 분류. 많은 레지스터가 둘 중 하나의 방식만 지원
(예외) ARM프로세서는 둘 다 지원(default는 little endian)
1.
Big Endian: leftmost byte is word address
IBM 360/370, Motorora 68k, MIPS, Sparc, HP PA
2.
Little Endian: right most byte is word address
Intel 80x86, DEC Vax, DEC Alpha ( windows NT)
32 bit 데이터가 있다고 했을 때, bit endian은 값이 큰 것을 끝에, little endian은 값이 작은 것을 끝에 넣음

Memory Operands

main memory 는 composite data에 많이 사용
Arrays, structures, dynamic data 등
arthmetic operations적용 위해서는
값들을 메모리에서 레지스터로 load하고
결과를 레지스터에서 메모리로 store한다
⇒ Load/Store Architecture : load, store같은 메모리에 접근할 수 있는 명령어가 지정되어 있어 arthmetic 연산에서는 메모리에 접근할 수가 없다. MIPS나 RISC계열에서 많이 사용
메모리의 기본단위는 byte
Words are aligned in memory
(메모리의) Address must be a multiple of 4(bytes) 왜? words가 32bit로 이뤄져있기 때문(MIPS)
MIPS is Big Endian
가장 중요한 바이트 word의 least address에서 가장 중요한 byte
c.f. Littls Endian : least-significant byte at least address

Memory Operand Example

#1

C code : g = h + A[8] ;
g in $s1, h in $s2, base address of A(A의 시작점) in $s3
Complied MIPS Code
index 8 requires offset of 32
4bytes per word
lw $t0, 32($s3) # load word(memory→register) add $s1, 32, $t0

#2

C code : A[12] = h + A[8] ;
h in $s2, base address of A(A의 시작점) in $s3
Complied MIPS Code
index 8 requires offset of 32
4bytes per word
lw $t0, 32($s3) # load word(memory→register) add $t0, $s2, $t0 sw $t0, 48($s3) # store word(register→memory) ※ 48($s3) : s3의 base address에다가 48더해줌 (index 8 requires offset of 48)

Register vs. Memory

레지스터는 메모리보다 빠르다.
메모리데이터를 다룰 때는 레지스터로 할당하는 loads, stores 가 필요하다 즉, 명령어가 더 필요하다.
가능하면 레지스터를 최대한 활용하여 메모리 접근을 줄이는 것이 좋다.
자주 사용하지 않는 변수는 메모리에 빼놓는다.
Register optimization은 매우 중요하다.

MIPS Register File

32개의 registers 있음
각 register는 32-bit
두개의 read ports와 하나의 write port

Registers are

faster than main memory
but register files with more locations are lower
(e.g. a 64 word file 은 32 word file 보다 50% 이상 느릴 수 있다)
Read/Write port increase impacts speed quadratically
Easier for a compiler to use
e.g., (A*B) - (C*D) - (E*F) can do multiplies in any order vs stack 이런 연산 시 register가 더 편리 - stack machine
Can hold variables so that
가능하면 레지스터에 많은 변수값을 가지고 있는 것이 좋다.
레지스터 많이 사용할수록 code density 향상 (since register are named with fewer bits than a memory location)

Immediate Operands

constant data specified in an instruction
addi $s3, $s3, 4 # s3 ← s3 + 4
add를 쓰면 4를 load하는 과정이 필요한데, 이렇게 하면 바로 상수 4를 쓸 수 있어 명령어 하나를 줄일 수 있음
i - immediate의 줄임말
subtract immediate instruction는 없다
negative constant 사용으로 해결한다
addi $s2, $s1, -1 # s3 ← s3 - 1

Design Principle

3.
Make the common case fast (amdahl's law)
small constants are common(0, 1같은 작은 상수를 많이 사용)
Immediate operand avoids a load instruction

The Constant Zero

MIPS Register 0($zero) is the constant 0 항상 0값을 가짐
cannot be overwritten
왜 만들었을까? 이것을 사용하여 다른 명령어를 간단하게 할 수 있다
Useful for common operations
E.g., move between registers (t2 ← s1)
move, copy같은 명령어 없이 가능
t2 ← s1 + 0
add $t2, $s1, $zero