차곡차곡 성 쌓기
article thumbnail

본 카테고리는 "혼자 공부하는 컴퓨터구조 + 운영체제 (강민철 저)" 책과 강의를 기반으로 작성하였습니다.


 

컴퓨터 구조 #10 - 명령어 병렬 처리 기법(파이프 라인, 비순차적 명령어 처리)

CPU 속도를 빠르게 하기 위해선 CPU가 쉬는 시간 없이 명령어를 처리하는 것이 매우 중요하다. 이를 쉽게 구현할 수 있는 방법이 바로 명령어 파이프 라인이다. 명령어 파이프 라인 하나의 명령어

uzinlab.tistory.com

앞선 글에서 CPU를 효율적으로 사용할 수 있는 방법인 파이프 라이닝에 대해 배웠다. 컴퓨터가 수행하는 명령어는 생김새, 연산, 주소 지정 방식 등이 달라 매우 다양하다. 하지만 이 중에서도 파이프 라이닝에 유리한 명령어들이 있다. 과연 이 중에서 파이프라이닝에 유리한 명령어는 무엇일까? 알아보도록 하자

 

명령어 집합

먼저 명령어 집합에 대해 알아야한다. 명령어 집합이란 특정 CPU가 이해할 수 있는 명령어의 모음이다. CPU라고 모든 명령어를 이해하고 해석할 수 있는 것이 아니라 해석할 수 있는 명령어가 정해져 있다. 그렇기 때문에 CPU는 자체적인 명령어 집합을 가지기 때문에 같은 소스코드라도 CPU에 따라 다른 어셈블리리어 코드로 변환되는 것이다. 

 

여기서 의문이 들었다. 기계어로 변환하는 것은 컴파일러인데 그러면 CPU마다 선택할 수 있는 컴파일러가 정해져 있는걸까? 

 

답은 CPU에에 따라 종속적인 코드가 만들어지는 것이다 이다. 소스코드는 컴파일되면서 중간 단계인 어셈블리어 코드로 변환된다. 하지만 아직 어셈블리어 코드는 플랫폼 독리접인 상태로 어떤 플랫폼이든지 실행 가능한 상태이다. 왜 굳이 기계어로 바로 변환하는 것이 아니라 어셈블리어 코드로 변환했다가 기계어로 변환하는 것일까? 거기에는 몇 가지 이유가 있다.

 

1. 플랙폼 독립성 : 중간 어셈블리어 코드는 어떤 플랫폼에서든 해당 플랫폼의 어셈블리어로 변환될 수있다. 높은 이식성을 갖게 한다.

2. 최적화 및 개선 : 어셈블리어 코드는 사람이 이해하기 쉬운 언어이기 때문에, 최적화 단계에서 더 효율적으로 코드를 변환할 수 있다. 또한 어셈블리어 코드는 하드웨어 아키텍처에 더 가깝게 매핑되어 있어, 특정 하드웨어의 성능 특성을 고려한 최적화가 가능하다.

 

이러한 이유 때문에 컴파일러는 중간 어셈블리어 코드로 만든 후, CPU 아키텍쳐에 맞춰 최종적으로 기계어로 변환한다. 또한 컴파일러는 다양한 CPU 아키텍쳐를 지원하기 때문에, 특정 CPU 아키텍쳐에 맞게 최종적으로 기계어를 변환하는 것이 가능하다.

 

예를 들어 x86 아키텍쳐를 사용하는 CPU와 ARM 아키텍처를 사용하는 CPU가 있을 때 동일한 컴파일러인 GCC 컴파일러를 이용하여 컴파일 시킬 수 있다. 하지만 이때 만들어지는 어셈블리어 코드는 CPU 아키텍쳐에 맞게 생성되기 때문에 서로 다르다. 

 

서론이 길었지만 결론은 CPU마다 해석할 수 있느 명령어가 다르고, 해석 가능한 명령어를 모아둔 것을 명령어 집합이라고 한다는 것이다.

CPU 마다 명령어 집합이 다르기 때문에 달라지는 것도 많다. 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등 다 달라진다. 또한 효율적인 명령어 처리를 위한 하드웨어 설계방식도 달라진다.

 

그래서 명령어 집합을 CPU의 언어라고도 하며, 하드웨어와 소프트웨어 간 서로를 어떻게 이해할지에 대한 약속이라고도 한다.

이러한 명령어 집합의 가장 대표적인 두 축이 있다. 바로 CISCRISC이다. 차례대로 알아보자

 

 

CISC (Complex Instruction Set Computer)

복잡한 명령어 집합을 활용하는 CPU 아키텍쳐

메모리 크기가 제한되었던 시절 유용한던 방식이었다. 대표적으로 x86, x86-64 프로세서 있으며, intel과 AMD가 해당 프로세서 사용한다.

명령어가 복잡하다는 것은 크기와 형태가 가변적이여서 다양한 활용이 가능하다는 것이다. 그렇기 때문에 다양한 명령어를 사용할 수 있으며, 상대적으로 적은 명령어로 프로그램을 실행할 수 있다. 

 

하지만 이러한 복잡한 CSIC의 단점은 바로 명령어 파이프 라이닝매우 불리하다는 것이다.

명령어 파이프 라이닝이 수월하게 이루어지기 위해선 클럭 주기로 처리 시간이 정형화 되어야 한다. 하지만 CSIC는 처리 시간이 매우 가변적이이서 딱 딱 실행 할 수가 없다. 또한 명령어가 복잡하기 때문에 여러 클럭 주기가 필요하다. 또 다른 단점은 복잡한 명령어는 잘 안 쓰인다는 것이다. 파레토 법착(상위 20%가 전체 생산의 80%를 해낸다는 법칙)이 컴퓨터에도 적용이 되어서, 잘 쓰이는 명령어 20%가 대부분을 차지하기 때문이다.

 

 

RISC (Reduced Instruction Set Computer)

명령어의 종류가 적고, 짧고 규격환된 명령어 집합을 활용하는 CPU 아키텍쳐

가급적 모든 명령어들이 1클럭 주기로 되어 있으며, 명령어 크기가 고정 길이다. 그렇기 떄문에 파이프 라이닝 매우 유리하다. 딱 딱 실행될 수 있기 때문이다.  이러한 장점 때문에 현태 컴퓨터들에서 RISC를 거의 사용한다. CISC를 쓰는 CPU도 내부적으로는 명령어를 쪼개서 실행하기 때문에 내부적으로 RISC가 구현되어 있다.

 

특징으로는 메모리 접근을 최소화 시키고 레지스터를 많이 활용해서 성능을 높인다. 그래서 범용 레지스터가 많이 사용된다. 

 

 

 

CISC와 RISC 비교

  CISC RISC
지원되는 명령어 복잡하고 다양함 단순하고 적음
명령어 길이 가변적 고정적
지원하는 주소 지정 방식 다양함 적음
프로그램을 이루는 명령어 수 적음 많음
파이프 라이닝 효과 매우 불리 매우 유리

 

728x90
profile

차곡차곡 성 쌓기

@nagrang

포스팅이 좋았다면 "좋아요" 해주세요!