나무 숲

RISC vs CISC 본문

Career

RISC vs CISC

wood.forest 2016. 6. 7. 23:01


High Level Language 프로그램의 연산 특성

- Assignment statement가 많다 -> 데이터의 단순한 이동이 많다

- 조건문 (if, loop)의 빈번한 사용 ->sequence control



High Level Language 프로그램의 operand 특성

- 대부분 local scalar 변수(assign과 관련) =>지역 스칼라 변수의 저장과 액세스에 관련된 부분을 우선적으로 최적화해야 함



Procedure Call

- depends on 처리하는 파라미터와 nesting의 깊이

- 대부분의 변수는 local

- Tanenbaum's study

* 매 프로시저 호출에서 요구되는 단어의 수가 많지 않으며, 참조의 많은 부분이 지역 스칼라 변수(비교적 적은 수)임을 알 수 있다.



... CISC보다 더 간단한 구조가 없을까..?

명령어 세트의 구조를 high level language에 맞추는 것은 비효율적! 전형적인 HLL 프로그램에서 많은 시간을 소비하는 특성들의 성능을 최적화해보자! 

h/w solution: 레지스터를 많이 사용하자! 그러면 더 많은 변수들이 레지스터에 저장될 수 있다.

s/w solution: (더 세밀한 프로그램 분석을 통해) 컴파일러가 레지스터의 사용을 극대화하도록 하자! 


Register의 사용!

- 대부분의 access가 지역 스칼라 변수들에 대한 것 =>store local scalar variables in registers => minimize memory access

- 주기억장치나 캐시보다 더 빠른 저장장치이므로 자주 사용하는 operand를 저장하므로써 레지스터와 기억장치 간의 이동을 최소화


Register Window란? Organization of registers to realize the goal

- 대부분의 operand 참조들이 local scalar variable에 대한 것이므로, 몇 개의 레지스터들만 global variable로, 나머지는 local variable을 저장하면 된다. 헌데 local의 정의는 각 procedure 호출과 복귀에 따라 변하며, 이 동작은 빈번히 일어난다. 따라서 매 호출 때마다 지역 변수들은 레지스터들로부터 기억장치로 저장되어야 하며, 그 레지스터들은 호출된 프로시저에 의해 재사용될 수 있어야 하고 이때 파라미터들도 전달되어야 한다. 또한 복귀 시 호출한 프로시저의 변수들이 레지스터로 다시 적재되어야 하며 그 결과값들도 호출한 프로시저로 다시 전달되어야 한다!

- 이 때 위에서 알 수 있는 결과들로 미루어 보면,


1) 전형적인 프로시저에서는 전송될 파라미터와 지역 변수들의 수가 적다! Only few parameters

2) 프로시저 호출의 깊이는 좁은 범위에서 이루어진다! Limited range of depth of call

  => 따라서 여러 개의 작은 레지스터 set을 이용하고, 각 set을 서로 다른 프로시저에 할당시켜 주면 프로시저가 호출되었을 때 다른 레지스터 set으로 switch시켜준다.


그림은 Overlapping Register Windows를 나타낸 것이다. 이를 보면, register set은 3개의 영역으로 나뉘어진 것을 볼 수 있다. 

* Parameter Registers 현재의 프로시저를 호출한 프로시저로부터 전송된 파라미터들과 재전송될 결과들을 가짐

* Local Registers 컴파일러에 의해 지정된 지역 변수들을 저장

* Temporary Registers 현재 실행중인 프로시저에 의해 호출된 프로시저와 파라미터, 결과값들을 교환

여기서 나타나는 overlap은 데이터의 실제 이동 없이 파라미터가 전송되도록 한다 (Local registers에 있는 내용은 j, j+1, j+2.. 로 가도 계속 보존되어 있다. 하지만 중첩되는 부분 이외는 완전히 별개!)


- 레지스터 파일들의 actual organization은 overlapping windows로 이루어진circular buffer와 같다

그림을 보자!


call이 만들어지면 Current Window Point(CWP)가 현재 실행중인 프로시저의 윈도우를 가리킨다. Saved Window Pointer(SWP)는 가장 최근에 기억장치에 저장된 윈도우를 가리킨다.

D가 E를 호출하면 E를 위한 변수들은 D의 임시 레지스터에 저장되고(w3, w4가 중첩되는 모습을 볼 수 있다) CWP는 한 윈도우만큼 전진한다

E가 F를 호출하면 그림의 상태로는 F의 윈도우가 A의 윈도우와 중첩되므로 호출을 처리할 수 없다. (만약 모든 윈도우들이 사용중이라면 인터럽트가 발생하며 가장 오래된 윈도우가 메모리에 저장된다) 이 때 CWP와 SWP가 같아지면서 인터럽트 발생, A의 윈도우에서 .in과 .loc만 저장하면 된다. 그 후 SWP 증가, F에 대한 호출을 다시 시작한다. 복귀 시에도, 예를 들어, F 호출 후 B가 A로 복귀할 때 CWP가 감소하여 SWP와 같아져 인터럽트가 발생, A의 윈도우를 복구한다.

= Studies show: 8 windows are enough to handle up to 99% of call/return without save/restore!







Global Registers

- allocated by the compiler to memory

자주 액세스되는 변수에게는 비효율적

- Have a set of registers for global variables





Registers vs Cache

 Large Register File

 Cache 

 All local scalars

 Recently used local scalars 

 Individual variables

 Blocks of memory 

 Compiler assigned global variables

 Recently used global variables 

 Save/restore based on procedure nesting 

 based on caching algorithm 

 Register addressing

 memory addressing 


- Referencing Scalar - Window based register file

가장 최근에 호출된 n-1개의 프로시저들의 모든 지역 스칼라 변수 저장

모든 변수를 저장하고 있으므로 시간이 절약됨

공간이 비효율적으로 사용될 수 있음

- Referencing Scalar - Cache

최근 사용된 스칼라 변수들의 일부분을 가짐

상황에 따른 대처로 공간을 유용하게 사용할 수 있다

데이터가 블록 단위로 읽혀져 사용되지 않는 것들도 있다


=>하지만 레지스터 방식!! 왜?

addressing overhead

레지스터 선택할 때에는 간단한 decoder. 캐시에서 참조할 땐 기억장치 주소 전체 필요



Compiler based register optimization

- 적은 수의 레지스터들만 사용 가능하다고 가정했을 때, 레지스터 사용의 최적화는 컴파일러가 담당. 

레지스터에 저장될 수 있는 프로그램 변수들은 symbolic or virtual register에 지정=>Map symbolic registers to real registers

사용이 overlap 되지 않는 Symbolic register들은 real register들을 공유할 수 있다

real register들을 다 사용하고 나면 변수들은 메모리를 사용할 수 있다



Graph Coloring

- 이웃한 노드는 다른 색. 색깔 수는 최소화

- 같은 색끼리->같은 register 할당







CISC

- Complex Instruction Set Computer


- 복잡하고 기능이 많은 명령어 

  ㄴ 고급 언어에 하나씩의 기계 언어를 대응시키므로써 명령어 집합이 커지고 가격도 올라간다. 모든 명령어에 대응시키기 때문


- Semantic gap : HLL(High-Level Language)에 제공되는 명령어와 컴퓨터 architecture 에 제공되는 명령어의 차이

ㄴLeads to: 

* 큰 명령어 set

* 더 많은 addressing mode(주소 지정 방식)

* 하드웨어로 구현되는 다양한 HLL 명령어

  to close the gap


- 컴파일러 작성이 쉽다 -> 이렇게 하기 위해 모든 복잡한 명령어의 처리를 하드웨어에게 맡겼다


- 컴파일러 단순화와 더 작은 프로그램을 만들고자 했지만 .. 제어장치가 크고 복잡해져 속도가 느려졌다..







RISC

- Reduced Instruction Set Computer


- RISC는 operand 참조를 최적화시키기 위해 많은 수의 레지스터를 사용한다. 위 내용을 보면 HLL명령어 실행을 위해 다수의 액세스가 많은 것을 알 수 있었는데, 차라리 많은 레지스터를 사용하고 기억장치 참조 회수를 줄이는 것이 성능 향상에 도움이 된다!


- 많은 양의 범용 레지스터/레지스터 사용을 최적화하기 위한 컴파일러 사용 (CISC의 명령어 중 많이 쓰이는 것을 추림)으로 한정되고 간단한 명령어 set

   ㄴ자주 쓰이는 것은 h/w에, 아닌 것은 s/w에게 처리를 맡김

  따라서 명령어 크기와 개수가 줄어들어(분업화가 쉬워 pipeline에 유리한 구조로 더욱 빨리 동작) 같은 내용을 처리할 때 CISC에 비해 프로그램 길이도 길어지고 저장 공간도 늘어난다. 하지만 캐시에서 빠르게 읽어오므로 속도는 빨라진다


- 효과적 사용을 위해 명령어 파이프라인 최적화가 필요함


- 특징

* One instruction per cycle 간단한 1 사이클 명령어는 마이크로코드가 아주 적거나 거의 필요 없어서 굉장히 빨리 수행된다

* Register to Register operations 명령어 세트 간략화, 제어 유닛 간략화 (자주 사용되는 operand를 고속 기억장치에 저장)

* Simple addressing mode 

* Simple instruction format 

=>컴파일러 최적화, 빠른 제어 유닛, 효과적인 명령어 pipelining, 인터럽트에 빠른 response








CISC vs RISC

- from CISC to RISC...

* 명령어 크기, 개수가 줄어든다

* 레지스터의 개수는 늘어난다

* 실행 속도가 빨라진다


- 요즘에는 RISC base CISC 부분적 동작 형식으로







RISC Pipelining

- most instructions are register to register


- execute:

I: Instruction fetch

E: Execute - ALU operation with register input and output

- load&store

I: Instruction fetch

E: execute - calculate memory address

D: memory - register to memory / memory to register operation


a)

b) memory가 한개. D, I가 동시에 이루어지면 안됨

c) 동시에 가능

728x90
반응형

'Career' 카테고리의 다른 글

Deadlock Detection Algorithm  (0) 2016.06.08
DeadLock Avoidance Algorithms  (0) 2016.06.08
File System  (0) 2016.06.06
Demand Paging  (0) 2016.06.05
Virtual Memory Management Strategy  (0) 2016.06.05
Comments