수업/Computer Architecture

Introduction

hw-ani 2022. 9. 13. 21:14

공통 집합의 hardware technologies가 computers에 사용되지만, 종류는 크게 3가지로 나뉜다.
1. Personal Computers (PCs)
2. Servers : 주로 network를 통해서만 접근된다.
3. Embedded Computers

 


Post-PC Era

Personal Mobile Device(PMD)가 급증PC를 대체해나가기 시작했다. 요즘의 PMD는 smart phone이나 tablet computer이지만, 이후엔 electronic glasses가 될지 모른다.


기존의 Server를 대체하는 놈도 등장하기 시작했는데, Cloud Computing이란 것이다.
Cloud Computing은 Warehouse Scale Computers(WSCs)라는 큰 datacenters에 의존하는, Internet을 통해 서비스를 제공하는 servers의 집합체이다.

Amazon이나 Google같은 기업들이 50,000개 정도의 서버를 가지는 WSCs를 구축해 다른 회사들이 이를 빌려 사용하도록 한다. (다른 회사들도 직접 구축해서 사용하는 것 보다 빌려쓰는게 이득인가봄)
PMDs나 WSCs가 하드웨어 산업에 혁신을 일으키듯, 이런 Cloud를 통해 제공되는 Software as a Service(SaaS)는 소프트웨어 산업에 혁신을 일으키고있다.
오늘날의 SW 개발자는 그들의 application의 일부분은 PMD에서 돌게하고, 일부분은 Cloud에서 돌게한다.

Q. SaaS ??
A. 기기에 binary code 자체가 설치돼 모든게 해당 기기에서 돌아가야하는 software도 있는 반면에,
SaaS는 software과 data를 서비스로서 전달해준다. 보통 고객 device에서 작동하는 browser같은 작은 프로그램을 통해 전달한다.
websearch나 social networking이 그 예시이다.

 


What You Can Learn in This Book

성공적인 프로그래머는 항상 본인이 만든 programs의 performance를 고민한다.
과거엔 메모리 사이즈가 작아서 memory 관리를 했어야했지만, 하드웨어의 발전으로 최근엔 embedded computing system이 아니면 크게 걱정할 필욘 없어졌다. (여전히 신경을 쓰긴 해야한다.)
대신 이젠 parallel nature of processors와 hierarchical nature of memories와 energy efficiency를 추가로 신경써야한다.

모두 내가 작성한 code밑에서 어떤 일이 일어나는지 이해해야 가능한 작업들이다.
그러므로 경쟁력을 갖춘 프로그래머가 되려면 computer organization에 대한 지식을 높여야한다.
(책을 모두 읽은 후 p.8의 질문들을 모두 이해하고 답변할 수 있어야 한다고 한다.)

Program의 performance를 정하는 요소

1. Algorithm : 프로그램 소스코드에서 쓰이는 알고리즘은 source-level의 statements 수와 실행되는 I/O operations 수를 결정한다.
2. Software System : Program을 machine instructions으로 바꿔주는 software system을 말한다, 예를들어 programming language/compiler/architecture 등이 있다.
얘네가 각 source-level statement를 instructions으로 바꾸기때문에, 변환된 instructions의 수를 결정한다.
3. Processor and Memory System : instructions이 얼마나 빨리 실행될지 결정한다.
4. I/O System : I/O operations이 얼마나 빨리 실행될지 결정한다.


Seven Great Ideas in Computer Architecture

  1. Use Abstraction to Simplify Design : 낮은 level의 details는 higher level에서의 간결성을 위해 숨겨진다.
  2. Make the Common Case Fast
  3. Performance via Parallelism
  4. Performance via Pipelining : parallelism의 특정한 패턴이다. computer architecture에서 너무 일반적이여서 아예 따로 이름을 붙여서 뺀 것이다.
  5. Performance via Prediction : 확실히 알때까지 기다리는 것 보다 예측을 통해 진행하는 것의 평균 속도가 더 빠르다. 오판을 recover하는 것의 비용도 비싼 편이 아니고, 예측이 비교적 정확하다고 가정한다면 그렇다.
  6. Hierarchy of Memories : 다들 싸고, 크고, 빠른 메모리를 원한다. 하지만 빠른데 가격이 쌀 순 없다. 그래서 용도에 따라 memory를 나눠서 사용한다. 빠른 놈은 비싸기때문에 CPU에서 cache memory 용도로 조금만 사용하고, 대부분은 적당한 빠르기의 RAM에 저장된다. 하드디스크는 가장 큰 저장공간을 가지지만 속도가 가장 느리다. 이렇게 필요에따라 계층을 나눠 메모리를 사용하는 것이다.
  7. Dependability via Redundancy : Computer는 빠르기만해선 안되고 dependable해야한다, 모든 물리적 기계는 오류가 발생할 수 있다. 중복 구성 요소를 통해 신뢰 혹은 dependability를 증가시킬 수 있다. 예를들어 우주에 컴퓨터를 가져간다고 해보자. 방사선이 지나가다가 컴퓨터 내 비트들을 건들일 수도 있다. 이런 오류로부터 보호하기위해 데이터를 여러 곳에 두거나 같은 연산을 여러번 해보는 등 중복 작업을 통해 fail로부터 cover할 수 있다.
  8. Designing for Moore's Law : 원래 무어의 법칙이 이곳에 있었으나 2nd edition에선 빠졌다. 초기엔 정확했으나, 최근들어서 해당 법칙이 들어맞지 않게 됐기 때문이다.

 


Below Your Program

우리가 실행하는 코드들은 상당히 정교하고 복잡하다. 하지만 밑으로 내려가보면 hardware는 간단한 low-level instruction 몇개만 수행할 수 있을 뿐이다.

여러 layer의 software가 high-level operation을 간단한 computer instruction으로 translate(or interpret)한다. (abstraction)

 

계층 구조 간단하게 3단계로)
1. Hardware : cpu, memory, ...

2. Systems software : OS, compilers, loaders, assemblers, ...

(운영체제와 컴파일러가 최근 모든 컴퓨터 시스템의 system software의 중요부분이다.)

3. Application software : 우리가 아는 각종 소프트웨어들...

 

※ High-Level Language -> Language of Hardware ??

가장 밑단의 하드웨어엔 CPU마다 정해진 instruction set이 있다.

instruction은 결국 0과 1의 이진수로 표현된다. 특정 이진수 패턴에 특정 연산을 하도록 의미를 부여한 것이다.

이런 이진수 instruction은 사람이 알아보기 어려우니 문자형태로 "치환"한 것이 assembly language이다.

(그래서 instruction이 CPU마다 다르니 당연히 assembly language도 CPU마다 다른 것)

 

high-level language(like C)는 해당 언어의 compiler 규칙에 따라 알맞은 assembly language로 변환된다.

이후 assembly language는 기계어 표현으로 그대로 치환된다.

 

이렇게 abstraction 개념을 이용해 만들어진 high-level language의 장점은 다음과 같다.

1. 훨씬 더 자연스러운 언어로 생각할 수 있다.

2. 각 언어가 만들어진 의도에 맞게 사용되도록 할 수 있다. ex) Fortran은 scientific computation을 하기위해 design됐고, Cobol은 비지니스 데이터 processing을 위해, ..... (C나 C++ 등도 예외는 아닌듯, 자유도가 높긴하다만 개념에 맞게 잘 쓰자.)

3. 프로그래머의 생산성을 높인다.

4. 간결해진다.

5. 개발중인 computer와 독립적으로 된다.

 


Under the Covers

(위에선 software의 밑을 파헤쳐봤었는데, 여기선 hardware의 밑을 파헤쳐본다.)

(참고: 너무 중요해서 영원히 기억했으면 좋겠는건 "The Big Picture" section에 모아뒀다고 한다.)

 

※ Computer의 5가지 요소

five classic components of computer

1. Input

2. Output

3. Memory : program이 작동할때 저장되는 곳이다.

4. Datapath : arithmetic operations을 수행한다.

5. Control : datapath, memory, I/O 장치 등에 instructions에 따라 지시를 내린다.

 

datapath와 control을 합쳐서 "Processor"라 부른다.

위 요소들은 hardware 기술과는 무관(독립적)하다. 즉, 과거/현재의 어떤 computer의 구성요소든 위 다섯가지 카테고리로 분류된다.

 

실제 hardware에서 보자면, Integrated Circuits(chips)안에 Processor(CPU)가 있다. (CPU가 IC이기도하고 혼용돼서 쓰이긴함) (CPU는 Central Processor Unit이다.)

 

 

※ Memory

DRAM(Dynamic Random Access Memory)

: integrated circuit으로 만들어진다. sequential-access를 제공하는 magnatic tape와는 다르게 random access가 가능하다. 대부분 Computer에서 메인 메모리로 DRAM을 사용한다.

SRAM(Static Random Access Memory)

: 마찬가지로 integrated circuit으로 만들어지고, random access를 제공한다.

DRAM에 비해 더 빠르고, 밀집도가 낮고, 더 비싸다. DRAM보다 빠르기 때문에 Processor 내부에 Cahe memory에 쓰인다.

마치 DRAM의 buffer처럼 행동한다.

 

Secondary memory

: 위에서 말한 메모리들은 volatile이라 전원이 꺼지면 사라진다. 그래서 nonvolatile인 안전한 저장장소가 필요하다.

보통 일반 PC에선 magnetic disks를 사용하고, PMD에선 flash memory를 사용한다. (둘다 nonvolatile)

flash memory는 DRAM보다 느리지만, 더 싸고 더 작아서 거의 PMD의 표준 secondary memory이다.

하지만 flash memory는 100,000~1,000,000번정도 writes하게되면 다 낡아버리니 쓰기 횟수를 잘 tracking해야한다.

 

 

※ Networks

다른 computers와 통신할 수 있는 기술이다. length와 performance에 따라 종류가 다양하다.

Ethernet은 local area network라고도 불리는데, 단거리 통신에서 주로 쓰인다.

Wide area networks는 Internet과 Web의 뼈대가된다. 광섬유를 통해 대륙을 건너간다.

최근엔 networking의 혁신으로 Wireless technology도 널리 쓰인다.


가장 중요한 abstraction 중 하나는 hardware와 low-level software사이의 interface이다.

둘은 그 중요 interface인 Instruction Set Architecture(architecture)을 통해 소통한다.

이 덕분에 동일한 software를 다른 hardware에서도 돌릴 수 있다.

 

ABI (Application Binary Interface)

: 기본 Instruction Set과 OS interface의 조합이다.


Processor와 Memory를 만들기 위한 기술?

둘 다 결국 circuit의 집합체인 Integrated Circuit이다.

가장 기본 단위는 on/off 기능을 구현할 수 있는 transistor이다.

이 trasistor이 몇십에서 몇백개가 모이면 Integrated Circuit(IC)가 된다.

몇백만개가 모인 것은 Very Large-Scale Integrated circuit(VLSI)이라 한다.

(최근엔 Ultra large-scale integrated circuit도 나옴.)

 

IC는 어떻게 만드는 것일까?

간단하게 말하자면, 일단 silicon crystal ingot이라는 놈을 매우 얇게 잘라서 wafer들을 만들어 낸다.(0.1인치 이하 두께)

얘네를 20~40번의 (화학적) 공정을 거쳐 patterned wafer로 만들어내는데, 각각 패턴칸에 도체/반도체/부도체가 와서 IC를 구성하는 요소가 된다.

근데 20~40번씩이나 뭔가를 해대면 모든 칸들이 유효하진 않다, 완벽한 놈을 만들어내기가 거의 불가능하다.

그래서 계속 testing을 하면서 칸을 더 작게 잘라간다.(이런 표현이 맞는진 모르겠네)

그럼 사용할 수 있는 부분이 계속해서 커지는 것이다. 최대한 세분화해서 defects를 분리해내고 고객에게 판매하는 것이다.

 


Performance

Computers의 Performance를 결정하는 것은 매우 어려운 일이다. (아예 따로 과목을 편성할정도로..)

왜냐하면 Performance에 영향을 주는 요인이 엄청나게 많기 때문이다.

그럼에도 불구하고 컴퓨터 성능 측정은 꽤나 중요한 작업이므로 겉핥기로라도 한번 해보자.

 

크게 아래 두가지 요인으로 Performance를 결정해보자.

1. Response Time (Execution Time) : 해당 작업의 처음부터 끝까지 걸린 시간. I/O시간, 메모리접근시간, CPU실행시간 등등 모든 것을 포함한 시간.(elapsed time, wall clock time 이라고도 함)

2. Throughtput (Bandwidth) : 단위 시간 내에 완료된 작업의 개수


둘이 같은게 아닌가 생각할 수 있는데, 아니다.

system에 processor만 하나 추가했다고 생각해보자. 그럼 execution time이 빨라진단 보장은 없지만 확실히 throughtput은 증가한다.

(모든 작업이 병렬적으로 시행된다고 빨리 되는건 아니다. 예를들어 linked list에서의 탐색은 병렬처리가 쓸모없다.)

(하지만! throughtput이 증가하면 queue내를 빨리빨리 비우므로 실제로 execution time이 증가하는 경우가 많긴하다. 즉, 실전에서 둘은 거의 영향을 주고받긴한다.)

 

우리는 여기서 우선 Response time만 고려한다. 즉 완벽한 performance 측정이 아님은 알고가자.

컴퓨터 x에 대한 performance

 

두 컴퓨터의 "성능" 비교는 "나누기"를 통해 한다.

주의해야할 것은, 당연히 performance끼리 나눴을때 1보다 큰 숫자가 나오면 분자의 performance가 더 좋다는 것이고, execution time끼리 나눴을때 1보다 큰 숫자가 나오면 분자의 performance는 더 안좋단 의미다. 실수하지 말기.

(주로 as fast as란 표현을 많이 사용)

 

그런데 execution time(response time)의 문제점은, task를 완료하기위한 total time이란 것이다.

computers는 공유될 수 있고, processor는 한가지 이상의 일을 동시에 할 수 있다. 이런 상황에서 system은 throughtput을 최적화하려고하지, 한 프로그램의 execution time을 줄이려고 하진 않는다.

그래서 task를 완료하기위한 total time이 아닌, processor가 일하는 시간만을 분리해 측정하면 좀 더 공정(?)할 것이다.

그걸 CPU execution time or CPU time 이라 한다.

그래서 system performance라 함은 response time을 말하는 것이고, CPU performance라 함은 CPU time을 말하는 것이다.

 

clock이라는 것은 hardware에서 events가 발생하는 지점이다.

그 clock 사이 시간 간격을 clock cycles (혹은 ticks, clocks, cycles, clock tichks, clock periods라고함) 라고 한다.

clock cycles는 보통 picoseconds(ps)라는 단위로 나타낸다.

clock rate는 clock cycles의 역수이다. 보통 4GHz 등으로 표현된다.

이제 프로그램 px에 대한 Execution time을 다음과 같이 clock개념을 활용해 나타낼 수 있다.(performance는 그냥 역수)

여기서 CPU clock cycles는 clock 수로 보면 될듯

(즉 hardware designers는 clock cycle time을 줄이거나 clock rate를 올림으로써 성능을 높일 수 있겠다. 하지만 그런 대부분의 기술이 서로 상쇄된다. 즉, clock cycle time을 줄이면 당연히 clock rate이 올라가고...)

 

 

Execution time은 특정 프로그램의 instruction의 수에도 당연히 영향을 받는다.

CPI는 instruction당 clock cycles의 평균 개수이다. IC는 특정 프로그램의 instructions 개수(Instructions Count)이다.

 

 

종합

computer performance를 측정하는 믿을만한 수단은 시간이다.

제일 마지막 식에서 가운데는 CPI이고 좌우로 IC와 clock cycle time이 추가로 곱해진 것이다. 즉, CPU time 첫번재 식이랑 다를게 없다.

보면 알겠지만, clock cycles이든 CPI이든 서로 상쇄되기때문에 성능을 올리기가 쉽지 않다.

 

 

Algorithm : IC와 CPI에 영향을 준다.

Programming Language : IC와 CPI에 영향을 준다.

Compiler : IC와 CPI에 영향을 준다.

ISA : IC와 CPI와 Clock Rate에 영향을 준다. (RISC가 CISC보다 clock rate가 빠르다.)


The Power Wall

CPU clock rate와 Power는 서로 상관관계가 있기때문에 시간이 흐르며 동시에 증가하는 양상을 보였다.

하지만 post-PC 시대에서 energy는 중요한 자원이었다. PMD에서 배터리 수명은 퍼포먼스를 좌지우지하고, WSC에서도 5만대의 서버를 돌리거나 cooling을 하려면 이는 중요하다.

즉, 과거엔 clock rate를 막 올려가며 CPU 성능을 높였지만, 어느 순간 cooling 한계 등으로 인해 power wall에 부딪혀 다른 방법을 찾아야했다.

(power는 capacity load와 voltage^2과 frequency(clock)에 비례하는데, frequency를 올려도 voltage를 낮춰서 power가 크게 증가하지 않도록 했(었)다고 함.)

 

그래서 Uniprocessor에서 Multiprocessor를 만들게 된 것이다. (이후 성장속도가 좀 둔화되긴 함)

쉽게말해 Core 하나의 성능을 끌어올리는데 한계가와서 그냥 core여러개를 붙여서 하나로 만들어버린 것이다.

과거의 software들은 hardware가 발전하며 알아서 빨라졌다. 연산 속도가 빨라져 자동으로 software도 빨라진 것이다.

하지만 Multiprocessor를 만들어 hardware 속도를 올리기 시작하자, 개발자들이 그에 맞게 그 특성을 이용해 Software를 개발하지 않으면 더 이상 빨라지지 않는다.(Parallelism)

application을 다른 processor에서 병렬적으로 동작하도록 해야하고, load balancing, commuication overhead, synchronization, ... 등 software 개발자의 몫이 늘어난 셈이다. 이는 제대로 하기엔 까다로운 작업이다.

 

 


요즘엔 CPU 성능을 어떻게 측정할까?

software를 돌려서 그 시간을 측정해보면 될 것이다. 이런 용도를 위해 고른 프로그램들을 benchmarks라 한다.

SPEC(System Performance Evaluation Cooperative)라는 비영리단체에선 processor의 성능에 초점을 맞춘 benchmark set을 만든다. GNU c compiler 등 다양한 프로그램을 포함한다.

발표된 년도에 따라 총 5가지 버전이 있다. (SPEC89부터 ~)

가장 최근 발표된 SPEC CPU2017은 10개의 integer benchmarks와 13개의 floating-point benchmarks를 포함한다.

 

성능 표현을 간단히 하기위해 각 benchmark별 SPECratio라는 것을 계산해서 이것들의 기하평균을 사용한다.

 


Fallacies(오류)

1. Computers at low utilization use little power.

: workload가 한 10퍼센트 정도인데 power를 33퍼센트 이상 사용하기도함(자세한 예시는 책 참고)

2. Designing for performance and designing for energy efficiency are unrelated goals.

: energy 효율을 올리면 performance도 올라가고, performance를 올리면 energy 효율도 올라간다.

 

Pitfalls(위험)

1. Expecting the improvement of one aspect of a computer to increase overall performance by an amount proportional to the size of the improvement.

: 가장 큰 부분을 차지하는 common case를 향상시켜야 크게 늘어난다. 전체 프로세스에서 10프로 정도 차지하는 놈을 50프로 향상시켜도 효과는 상대적으로 미미할 것이다. (관련 계산 문제ch1 ppt 마지막에서 두번째)

2. Using a subset of the performance equation as a performance metric.