본문 바로가기

CS/컴퓨터구조

[컴퓨터구조] 프로세서의 발전과 제약

현재 글은 Computer Organization and Architecture 및 대학 강의 내용에 의해 작성되었다.


시대를 거듭할 수록 컴퓨터 시스템의 가격은 감소하고, 성능은 증가하는 추세이다. 최근 많이 사용되는 클라우드 컴퓨팅 방식만 생각해 보더라도 과거 컴퓨터의 성능과 가격으로는 현재의 합리적 수준에 도달할 수 없었을 것이다.

이때, 컴퓨터의 성능을 향상시키는데 있어서 트랜지스터의 집적도도 중요하지만, 디자인 역시 중요한 요소 중 하나이다. 그렇다면 과거의 기술자들이 어떤 방식으로 컴퓨터의 성능을 향상시켰는지 보자.


Microprocessor Speed

 트랜지스터 집적도를 높이기 위한 칩 개발자들의 노력과는 별개로, 마이크로 프로세서 디자이너들은 해당 프로세서의 성능을 높이기 위한 디자인을 수행했다. 대표적인 디자인은 다음과 같다.

  • Pipelining
  • Branch prediction
  • Superscalar execution
  • Data flow analysis
  • Speculative execution

Pipelining

https://en.wikipedia.org/wiki/Instruction_pipelining

기호 의미
IF Instruction Fetch
ID Instruction Decode
EX Execute
MEM Memory Access
WB Register Write Back

 하나의 instruction 을 처리하는데는 다양한 과정이 필요하다. 명령어를 읽고, 이를 디코딩한 후 실행 및 메모리에 접근한다. 이때 각각의 동작 자체는 개별적으로 수행할 수 있으므로 명령을 하나씩 수행하는 것은 컴퓨터 자원의 낭비가 된다. 

 파이프라이닝은 명령어 실행 흐름을 일련의 단계로 쪼갠 후 여러개의 명령을 동시에 실행하는 방식으로, 컴퓨터 자원을 놀리지 않고 사용한다. 각 단계에서는 독립적이며, 동시에 수행할 수 있는 동작이기 때문에 하나의 프로세서 내에서도 다양한 동작을 동시에 수행할 수 있게 된다. 이때 각 단계에서 발생하는 데이터는 해당 단계에 대응되는 파이프라인 레지스터 안에 저장되며, 다음 사이클에서는 해당 정보를 다음 단계에 사용한다.

 예를 들어 위에서는 5개의 명령을 동시에 수행하는 모습을 보여준다. 명령의 단계 IF, ID, EX, MEM, WB는 한 클럭 내에서 동시에 실행될 수 있으므로 각각의 명령이 다른 단계를 진행하는 방식을 통해 동시에 수행되고 있다.

  한번에 실행될 수 있는 명령의 수는 명령의 단계 수에 비례하기 때문에, 단계 수가 적당히 많을 수록 좋다.

Branch prediction

 pipelining 기법이 instruction 병렬 처리에 좋기는 한데, 일부 문제가 존재한다. 특정 instruction 이 다른 instruction 에 종속적인 경우를 생각해보자.

CMP R1,R2 // R1, R2를 비교한다.
JE A // 비교한 결과가 R1 == R2 라면 A 로 점프한다.
 

 위 코드에서 JE 명령은 CMP 명령에 의한 결과 값에 종속적으로 동작한다. 따라서 실제 결과가 어떤지에 따라 A가 가리키는 코드로 점프하여 해당 코드들을 실행할지, 실행하지 않을지 알 수 없게 된다. 따라서 해당 명령들을 파이프라이닝 하기 위해서는 branch의 결과 값을 예측하여 미리 알고 있어야 한다. 이처럼 branch ( if 문 등 ) 의 값을 미리 예측하여 사용하는 방식이 branch prediction 이다. 

 사실 프로그램을 작성할때 단발적 조건문인 if  문을 남발하는 경우는 잘 없다. 많은 경우 branch는 for 이나 while 문에서 발생하기 때문이다. 덕분에 Branch Prediction 의 예측도는 꽤 높다고 한다.

Superscalar Execution

 파이프라이닝의 각 단계는 단일 시간에 하나의 명령만을 수행하는 것을 전제한다. 예컨대 여러 단계를 기반으로 명령의 병렬 처리가 가능하지만, 하나의 단계에서는 단 한개의 명령만 처리할 수 있는 것이다.

 Superscalar Processor 은 instruction path 자체를 여러개 두는 방식을 통해 한번에 여러개의 파이프라인을 이용한다. 각 사이클에 여러개의 값을 읽어온 후, 해당 값들을 여러개의 파이프라인을 통해 처리하는 것이다.

 이 디자인은 instruction path을 여러개 가질 수록 좋지만, 무작정 개수를 늘린다고 성능이 좋아지지는 않는다. 그 이유는Instruction 사이의 의존성이 생각보다 높기 때문이다. 간단한 덧셈을 생각해보자.

LDA R1, A // A 의 값을 R1에 로드한다.
ADD R3,R1,R2 // R1, R2 값을 더해 R3 에 저장한다.

 위 코드에서는 A 위치에 저장된 값을 레지스터 R1에 옮긴 후, R1 + R2 -> R3 을 진행하고 있다. 이때 논리 순서 상 ADD의 결과 값은 LDA  명령에 종속적이므로, 반드시 두 명령은 순서대로 실행되어야만 한다. 이 처럼, 생각보다 많은 코드가 서로에게 종속적으로 동작하기 때문에 ILP(Instruction-Level Parallelism) 은 생각보다 썩 높지 않다고 한다. 그럼에도 현재 프로세서들은 이 기술을 발전시켜서 엄청난 성능을 보이고 있다.

Data flow analysis

 프로그램의 다양한 지점에서 계산가능한 값 집합에 대한 정보를 수집하는 기술로, 데이터 혹은 다른 instruction에 대한 명령의 의존성 관계를 분석하여 최적의 방식으로 명령을 스케줄링하기 위해 사용된다고 한다.

Speculative execution

  branch prediction 및 data flow analysis 을 이용하여 얻은 instruction 들이 실제로 실행되는지 여부를 판단하기 전에 미리 실행하는 방식을 통해 맞았을 때의 딜레이를 줄이는 방법이다. 

 이 기법에 의해 실행되는 작업은 미래에 반드시 실행될 것이라는 보장이 없다. 만약 코드 흐름 상에서 해당 작업들이 실행될 필요가 없었다고 판단되면, 미리 수행했던 작업을 모두 취소해야 하는 불상사가 생긴다. 명확하지 않은 미래에 대해 마치 투기하는 것 같다고 해서 Speculative 라는 말이 붙었다.


Performance Balance

 여러 기술자들의 노력을 통해 프로세서의 성능이 높아지더라도, 해당 프로세서의 성능을 이끌어 내기 위해서는 다른 장치들과의 밸런스가 중요하다. 예를 들어 CPU가 아무리 성능이 좋더라도 메모리가 해당 속도를 따라가지 못한다면 컴퓨터는 메모리 한계에 준하는 성능을 가지게 될 것이다. 따라서 프로세서 이외의 요소들의 성능도 균형을 이룰 필요가 있는데, 다음과 같은 요소들이 있다.

  • 데이터에 대한 엑세스 횟수를 줄이기 위해 DRAM이 한번에 많은 데이터를 읽어 올 수 있게 만든다.
  • 데이터 버스의 크기를 늘려 한번에 더 많은 데이터를 전달한다.
  • 프로세서와 메모리 사이에 적절한 캐시 구조를 두어 메모리 액세스 횟수를 줄인다.
  • DRAM 인터페이스를 개선하여 자체적으로 내부에 캐시를 가지도록 만든다.
  • 버퍼링, 구조적 계층화 등을 거친 고속 버스를 이용하여 CPU 와 메모리 사이의 전달 속도를 높인다.

칩의 발전과 제약

Computer Organization and Architecture 10th 발췌

칩의 발전에 기여한 요소는 다음과 같다.

  • 칩셋 공정 감소로 인한 트랜지스터 집적도 증가에 의한 클럭 속도 증가
    • feature size 감소 -> 게이트 크기 감소 -> 단위면적 당 게이트 수 증가 + 신호 전파 경로 감소로 인한 속도 증가
  • CPU / 메모리 사이에 캐시를 두거나, 자체적으로 캐시를 가짐으로서 속도 증가
  • 프로세서의 organization & architecture 변경을 통한 성능 향상
    • instruction 실행 순서 / parallelism 등

 과거에는 위와 같은 방법들을 통해 클럭 속도를 높일 수 있었다. 그러나 기술이 크게 발달함에 따라 더 이상 클럭 속도를 높이기 부담스러운 제한 사항들이 발생했다.

  • 파워 문제
    프로세서의 트랜지스터 집적도가 증가함에 따라  leakage current ( 누설 전류 ) 역시 증가하여 static power( 대기 상태 전력 소모 ) 의 비중이 전체 전력 소모량에서 큰 비중을 차지하게 되었고, 결과적으로 전력 소모가 크게 증가한다. 
  • RC delay
    트랜지스터의 크기가 감소함에 따라 해당 트랜지스터들을 연결하는 선의 길이, 두께도 덩달아 줄어들게 된다. 이는 선에 대한 저항 증가를 가져왔고, 해당 저항에 의해 트랜지스터 사이의 딜레이도 함께 증가한다.
  • Memory latency
    프로세서의 증가한 속도를 메모리가 따라가지 못하므로, 프로세서가 제 성능을 내지 못한다. 메모리는 기본적으로 DRAM으로 만드는데, DRAM은 주기적인 전력 공급이 필요한 설계 상 프로세서의 속도를 따라가도록 만드는 것 역시 힘들다.

 이러한 이유로 클럭 수 향상에 중점을 두었던 방식의 성능 향상 방식은 점차 중요도가 감소한다. 대신 덜 복잡한 구조 및 적당한 성능을 가진 코어를 여러개 두고 정보를 병렬처리하는 멀티코어 구조가 대두된다.