상위 질문
타임라인
채팅
관점

중앙 처리 장치

소프트웨어 명령의 실행이 이루어지는 컴퓨터의 부분, 혹은 그 기능을 내장한 칩 위키백과, 무료 백과사전

중앙 처리 장치
Remove ads

중앙 처리 장치(中央處理裝置) 또는 CPU(영어: central processing unit, central/main processor)는 주어진 컴퓨터에서 주된 프로세서이다.[1][2] CPU의 전자 회로산술, 논리, 제어 및 입출력(I/O) 연산과 같은 컴퓨터 프로그램명령을 실행한다.[3][4][5] 이러한 역할은 주기억장치 및 I/O 회로와 같은 외부 구성 요소와 대조되며,[6] 그래픽 처리 장치(GPU)와 같은 특수 코프로세서의 역할과도 대조된다.

Thumb
인텔이 만든 현대적인 고급 소비자용 CPU: 인텔 코어 i9-14900KF
Thumb
중앙 처리 장치 내부: 2006년에 처음 제조된 인텔 제온 3060집적 회로

CPU의 형태, 설계 및 구현은 시간이 지남에 따라 변했지만, 그 근본적인 작동 방식은 거의 변하지 않았다.[7] CPU의 주요 구성 요소로는 산술논리 연산을 수행하는 산술 논리 장치(ALU), ALU에 피연산자를 공급하고 ALU 연산 결과를 저장하는 프로세서 레지스터, 그리고 ALU, 레지스터 및 기타 구성 요소의 조정된 작동을 지시하여 가져오기(메모리에서), 디코딩실행(명령어)을 조율하는 제어 장치가 있다. 최신 CPU는 성능 향상을 위해 캐시명령어 수준 병렬성에 많은 반도체 영역을 할애하며, CPU 모드를 통해 운영체제가상화를 지원한다.

대부분의 최신 CPU는 집적 회로(IC) 마이크로프로세서로 구현되며, 단일 IC 칩에 하나 이상의 CPU가 포함된다. 여러 CPU가 포함된 마이크로프로세서 칩을 멀티 코어 프로세서라고 부른다.[8] '프로세서 코어'라고 불리는 개별 물리적 CPU는 CPU 수준의 멀티스레딩을 지원하기 위해 멀티스레딩될 수도 있다.[9]

CPU를 포함하는 IC는 또한 메모리, 주변기기 인터페이스 및 기타 컴퓨터 구성 요소를 포함할 수 있다.[10] 이러한 통합 장치는 다양하게 마이크로컨트롤러 또는 시스템 온 칩(SoC)이라고 불린다.

Remove ads

역사

요약
관점
Thumb
최초의 프로그램 내장식 컴퓨터 중 하나인 에드박

에니악과 같은 초기 컴퓨터는 다른 작업을 수행하기 위해 물리적으로 다시 배선해야 했으며, 이로 인해 이러한 기계들은 "고정 프로그램 컴퓨터"라고 불렸다.[11] "중앙 처리 장치"라는 용어는 1955년 이래로 사용되어 왔다.[12][13] "CPU"라는 용어는 일반적으로 소프트웨어(컴퓨터 프로그램) 실행을 위한 장치로 정의되므로, 진정으로 CPU라고 불릴 수 있는 최초의 장치는 프로그램 내장식 컴퓨터의 출현과 함께 나타났다.

프로그램 내장식 컴퓨터의 아이디어는 이미 존 프레스퍼 에커트존 윌리엄 모클리에니악 설계에 있었지만, 초기에는 더 빨리 완성하기 위해 생략되었다.[14] 1945년 6월 30일, 에니악이 만들어지기 전에 수학자 존 폰 노이만에드박의 보고서 최초 초안이라는 제목의 논문을 배포했다. 이 논문은 결국 1949년 8월에 완성될 프로그램 내장식 컴퓨터의 개요였다.[15] 에드박은 다양한 유형의 특정 수의 명령(또는 연산)을 수행하도록 설계되었다. 중요하게도, 에드박을 위해 작성된 프로그램은 컴퓨터의 물리적 배선으로 지정되는 대신 고속 컴퓨터 메모리에 저장되었다.[16] 이는 새로운 작업을 수행하기 위해 컴퓨터를 재구성하는 데 상당한 시간과 노력이 필요했던 에니악의 심각한 한계를 극복했다.[17] 폰 노이만의 설계로 에드박이 실행하는 프로그램은 단순히 메모리 내용을 변경하여 변경할 수 있었다. 에드박은 최초의 프로그램 내장식 컴퓨터는 아니었다. 소규모 실험용 프로그램 내장식 컴퓨터인 맨체스터 베이비는 1948년 6월 21일에 첫 프로그램을 실행했고,[18] 맨체스터 마크 1은 1949년 6월 16일에서 17일 밤 사이에 첫 프로그램을 실행했다.[19]

초기 CPU는 더 크고 때로는 독특한 컴퓨터의 일부로 사용되는 맞춤형 설계였다.[20] 그러나 특정 애플리케이션을 위한 맞춤형 CPU를 설계하는 이 방법은 대량 생산되는 다목적 프로세서 개발로 크게 바뀌었다. 이러한 표준화는 개별 트랜지스터 메인프레임미니컴퓨터 시대에 시작되어 집적 회로(IC)의 대중화로 빠르게 가속화되었다. IC 덕분에 점점 더 복잡한 CPU를 나노미터 단위의 공차로 설계하고 제조할 수 있게 되었다.[21] CPU의 소형화와 표준화는 디지털 장치의 현대 생활 속 존재감을 전용 컴퓨팅 기계의 제한된 응용 범위를 훨씬 넘어 확장시켰다. 현대 마이크로프로세서는 자동차[22]부터 휴대폰[23]에 이르기까지 다양한 전자 장치에 나타나며, 때로는 장난감에도 사용된다.[24][25]

폰 노이만은 에드박의 설계로 인해 프로그램 내장식 컴퓨터 설계의 공로를 가장 자주 인정받고 있으며, 그의 설계는 폰 노이만 구조로 알려지게 되었지만, 그 이전에도 콘라트 추제와 같은 다른 사람들이 비슷한 아이디어를 제안하고 구현했다.[26] 에드박 이전에 완성된 하버드 마크 I의 소위 하버드 아키텍처는 전자 메모리가 아닌 천공 테이프를 사용하는 프로그램 내장식 설계를 사용했다.[27][28][29] 폰 노이만 아키텍처와 하버드 아키텍처의 주요 차이점은 후자는 CPU 명령과 데이터의 저장 및 처리를 분리하는 반면, 전자는 둘 다에 동일한 메모리 공간을 사용한다는 것이다.[30] 대부분의 현대 CPU는 주로 폰 노이만 설계이지만, 하버드 아키텍처를 사용하는 CPU도 특히 임베디드 애플리케이션에서 볼 수 있다. 예를 들어, 아트멜 AVR 마이크로컨트롤러는 하버드 아키텍처 프로세서이다.[31]

릴레이진공관은 스위칭 요소로 흔히 사용되었다.[32][33] 유용한 컴퓨터는 수천 또는 수만 개의 스위칭 장치를 필요로 한다. 시스템의 전체 속도는 스위치의 속도에 따라 달라진다. 에드박과 같은 진공관 컴퓨터는 고장 간 평균 8시간이었던 반면, 더 느리지만 더 이른 하버드 마크 I과 같은 릴레이 컴퓨터는 거의 고장이 나지 않았다.[13] 결국, 진공관 기반 CPU는 제공되는 상당한 속도 이점이 일반적으로 신뢰성 문제를 능가했기 때문에 지배적이 되었다. 이 초기 동기식 CPU의 대부분은 현대 마이크로 전자 설계에 비해 낮은 클럭 속도로 작동했으며, 이는 주로 구축된 스위칭 장치의 속도에 의해 제한되었다. 100 kHz에서 4 MHz에 이르는 클럭 신호 주파수는 이 시기에 매우 흔했다.[34]

트랜지스터 CPU

Thumb
IBM PowerPC 604e 프로세서

다양한 기술이 더 작고 안정적인 전자 장치 제작을 용이하게 하면서 CPU의 설계 복잡성이 증가했다. 이러한 첫 번째 개선은 트랜지스터의 출현과 함께 이루어졌다. 1950년대와 1960년대의 트랜지스터화된 CPU는 더 이상 진공관릴레이와 같이 부피가 크고 신뢰성이 없으며 깨지기 쉬운 스위칭 요소로 만들어질 필요가 없었다.[35] 이러한 개선으로 더 복잡하고 신뢰성 있는 CPU가 개별 구성 요소를 포함하는 하나 또는 여러 인쇄 회로 기판 위에 구축되었다.

1964년, IBM은 다양한 속도와 성능으로 동일한 프로그램을 실행할 수 있는 일련의 컴퓨터에 사용된 IBM 시스템/360 컴퓨터 아키텍처를 도입했다.[36] 이는 당시 대부분의 전자 컴퓨터가 동일한 제조업체에서 만든 컴퓨터조차 서로 호환되지 않았던 시기에 중요한 의미를 가졌다. 이러한 개선을 용이하게 하기 위해 IBM은 오늘날의 CPU에서도 널리 사용되는 마이크로코드의 개념을 사용했다.[37] 시스템/360 아키텍처는 수십 년 동안 메인프레임 시장을 지배할 정도로 인기가 많았으며, IBM의 zSeries와 같은 현대의 유사 컴퓨터에도 그 유산이 이어지고 있다.[38][39] 1965년, 디지털 이큅먼트 코퍼레이션(DEC)은 과학 및 연구 시장을 겨냥한 또 다른 영향력 있는 컴퓨터인 PDP-8을 소개했다.[40]

Thumb
후지쯔 본사에 전시된 SPARC64 VIIIfx 프로세서가 탑재된 후지쯔 보드

트랜지스터 기반 컴퓨터는 이전 모델에 비해 몇 가지 뚜렷한 장점을 가졌다. 신뢰성 향상과 낮은 전력 소비를 가능하게 할 뿐만 아니라, 트랜지스터는 진공관이나 릴레이에 비해 스위칭 시간이 짧아 CPU가 훨씬 빠른 속도로 작동할 수 있도록 했다.[41] 스위칭 요소의 신뢰성 향상과 극적으로 빨라진 속도(이때 거의 전적으로 트랜지스터가 사용됨) 덕분에 이 시기에는 수십 메가헤르츠의 CPU 클럭 속도를 쉽게 얻을 수 있었다.[42] 또한, 개별 트랜지스터 및 IC CPU가 활발히 사용되는 동안, 단일 명령어 다중 데이터(SIMD) 벡터 프로세서와 같은 새로운 고성능 설계가 나타나기 시작했다.[43] 이러한 초기 실험적 설계는 나중에 크레이 Inc후지쯔와 같은 전문 슈퍼컴퓨터 시대를 열었다.[43]

소규모 집적 CPU

Thumb
중규모 집적 회로로 만들어진 DEC PDP-8/I의 CPU, 코어 메모리외부 버스 인터페이스

이 시기에 컴팩트한 공간에 많은 상호 연결된 트랜지스터를 제조하는 방법이 개발되었다. 집적 회로(IC)는 단일 반도체 기반 다이 또는 "칩"에 많은 수의 트랜지스터를 제조할 수 있게 했다. 처음에는 NOR 게이트와 같은 매우 기본적인 비전문 디지털 회로만 IC로 소형화되었다.[44] 이러한 "블록" IC를 기반으로 한 CPU는 일반적으로 "소규모 집적"(SSI) 장치라고 불린다. 아폴로 가이던스 컴퓨터에 사용된 것과 같은 SSI IC는 일반적으로 수십 개의 트랜지스터를 포함했다. SSI IC로 전체 CPU를 구축하려면 수천 개의 개별 칩이 필요했지만, 이전의 개별 트랜지스터 설계보다 훨씬 적은 공간과 전력을 소비했다.[45]

IBM의 시스템/370은 시스템/360의 후속 모델로, 솔리드 로직 기술 개별 트랜지스터 모듈 대신 SSI IC를 사용했다.[46][47] DEC의 PDP-8/I와 KI10 PDP-10도 PDP-8과 KA PDP-10에서 사용되던 개별 트랜지스터에서 SSI IC로 전환했으며,[48] 그들의 매우 인기 있는 PDP-11 라인은 원래 SSI IC로 구축되었지만, 나중에 LSI 구성 요소가 실용화되면서 LSI로 구현되었다.

대규모 집적 CPU

리 보이스텔은 1967년의 "선언문"을 포함한 영향력 있는 기사들을 발표했는데, 이 기사들은 상대적으로 적은 수의 대규모 집적 회로(LSI)로 32비트 메인프레임 컴퓨터와 동등한 것을 구축하는 방법을 설명했다.[49][50] 백 개 이상의 게이트를 가진 칩인 LSI 칩을 구축하는 유일한 방법은 금속–산화물–반도체(MOS) 반도체 제조 공정(PMOS 논리, NMOS 논리, 또는 CMOS 논리)을 사용하여 구축하는 것이었다. 그러나 일부 회사는 1970년대까지 접합형 트랜지스터가 MOS 칩보다 빨랐기 때문에 양극성 트랜지스터-트랜지스터 논리(TTL) 칩으로 프로세서를 계속 구축했다 (몇몇 회사들은 데이터포인트와 같이 1980년대 초까지 TTL 칩으로 프로세서를 계속 구축했다).[50] 1960년대에는 MOS IC가 더 느렸고 처음에는 저전력이 필요한 응용 분야에서만 유용하다고 여겨졌다.[51][52] 1968년 페어차일드 반도체에서 페데리코 파진에 의해 실리콘 게이트 MOS 기술이 개발된 이후, MOS IC는 1970년대 후반에 양극성 TTL을 표준 칩 기술로 크게 대체했다.[53]

마이크로전자 기술이 발전함에 따라, 점점 더 많은 트랜지스터가 IC에 집적되어 완전한 CPU에 필요한 개별 IC의 수가 줄어들었다. MSI 및 LSI IC는 트랜지스터 수를 수백 개, 그리고 수천 개로 늘렸다. 1968년에는 완전한 CPU를 구축하는 데 필요한 IC 수가 8가지 유형의 24개 IC로 줄어들었으며, 각 IC는 약 1000개의 MOSFET을 포함했다.[54] SSI 및 MSI 이전 모델과 현저히 대조적으로, PDP-11의 첫 LSI 구현은 단 4개의 LSI 집적 회로로 구성된 CPU를 포함했다.[55]

마이크로프로세서

Thumb
인텔 80486DX2 마이크로프로세서의 다이(실제 크기: 12 × 6.75 mm)와 패키지
Thumb
바이오 E 시리즈 노트북 마더보드의 인텔 코어 i5 CPU (오른쪽, 히트파이프 아래)
Thumb
CPU가 소켓에서 제거된 노트북 내부

마이크로프로세서가 처음 도입된 이후 거의 모든 다른 중앙 처리 장치 구현 방법을 완전히 대체했다. 1971년에 출시된 최초의 상업용 마이크로프로세서는 인텔 4004였다. 인텔 4004는 산술 논리 장치, 제어 장치프로세서 레지스터를 칩 하나에 통합한 최초의 소비자용 CPU 중 하나였다.[56] 1974년에 출시된 최초의 널리 사용된 마이크로프로세서는 인텔 8080이었다. 당시의 메인프레임 및 미니컴퓨터 제조업체들은 기존의 컴퓨터 구조를 업그레이드하기 위해 독자적인 IC 개발 프로그램을 시작했고, 결국 기존 하드웨어 및 소프트웨어와 하위 호환되는 명령어 집합 호환 마이크로프로세서를 생산했다. 유비쿼터스 개인용 컴퓨터의 출현과 궁극적인 성공과 결합하여, CPU라는 용어는 이제 거의 전적으로[a] 마이크로프로세서에 적용된다. 여러 CPU(코어라고 함)는 단일 처리 칩에 결합될 수 있다.[57]

이전 세대의 CPU는 하나 이상의 회로 기판에 개별 부품과 수많은 작은 집적 회로(IC)로 구현되었다.[58] 반면 마이크로프로세서는 매우 적은 수의 IC, 일반적으로 단 하나의 IC로 제조된 CPU이다.[59] 단일 다이에 구현됨으로써 전체 CPU 크기가 줄어든다는 것은 게이트 기생 용량 감소와 같은 물리적 요인으로 인해 스위칭 시간이 빨라진다는 것을 의미한다.[60][61] 이를 통해 동기식 마이크로프로세서는 수십 메가헤르츠에서 수 기가헤르츠에 이르는 클럭 속도를 가질 수 있었다. 또한, IC에 매우 작은 트랜지스터를 구축하는 능력은 단일 CPU의 복잡성과 트랜지스터 수를 여러 배 증가시켰다. 이 널리 관찰되는 추세는 2016년까지 CPU(및 기타 IC) 복잡성 성장의 상당히 정확한 예측자로 입증된 무어의 법칙에 의해 설명된다.[62][63]

1950년대 이후 CPU의 복잡성, 크기, 구조 및 일반적인 형태는 엄청나게 변했지만,[64] 기본적인 설계와 기능은 거의 변하지 않았다. 오늘날 거의 모든 일반적인 CPU는 폰 노이만 프로그램 내장형 기계로 매우 정확하게 설명될 수 있다.[65][b] 무어의 법칙이 더 이상 유효하지 않음에 따라, 집적 회로 트랜지스터 기술의 한계에 대한 우려가 제기되었다. 전자 게이트의 극단적인 소형화는 일렉트로마이그레이션임계치 이하 누출(subthreshold leakage)과 같은 현상의 영향을 훨씬 더 중요하게 만들고 있다.[67][68] 이러한 새로운 우려 사항들은 연구자들이 양자 컴퓨터와 같은 새로운 컴퓨팅 방법을 조사하고, 고전적인 폰 노이만 모델의 유용성을 확장하는 병렬성 및 기타 방법을 확장하게 하는 많은 요인 중 하나이다.

Remove ads

작동

요약
관점

대부분의 CPU의 기본적인 작동 방식은 물리적 형태와 관계없이 프로그램이라고 불리는 일련의 저장된 명령을 실행하는 것이다. 실행될 명령은 일종의 컴퓨터 메모리에 보관된다. 거의 모든 CPU는 명령 주기라고 통칭되는 가져오기(fetch), 디코딩(decode) 및 실행(execute) 단계를 따른다.

명령 실행 후, 전체 과정이 반복되며, 다음 명령 주기에서는 일반적으로 프로그램 카운터의 증가된 값으로 인해 순서상 다음 명령을 가져온다. 만약 점프 명령이 실행되면, 프로그램 카운터는 점프한 명령의 주소를 포함하도록 수정되고 프로그램 실행은 정상적으로 계속된다. 더 복잡한 CPU에서는 여러 명령이 동시에 가져와지고, 디코딩되고, 실행될 수 있다. 이 섹션에서는 일반적으로 "고전 RISC 파이프라인"이라고 불리는 것을 설명하며, 이는 많은 전자 장치(종종 마이크로컨트롤러라고 불림)에 사용되는 간단한 CPU에서 매우 일반적이다. 이 설명은 CPU 캐시의 중요한 역할과 따라서 파이프라인의 접근 단계를 거의 무시한다.

일부 명령어는 직접 결과 데이터를 생성하기보다는 프로그램 카운터를 조작한다. 이러한 명령어는 일반적으로 "점프"라고 불리며, 루프, 조건부 프로그램 실행(조건부 점프 사용), 그리고 서브루틴의 존재와 같은 프로그램 동작을 용이하게 한다.[c] 일부 프로세서에서는 다른 일부 명령어가 상태 "플래그" 레지스터의 비트 상태를 변경한다. 이러한 플래그는 종종 다양한 연산의 결과를 나타내기 때문에 프로그램 동작에 영향을 미치는 데 사용될 수 있다. 예를 들어, 이러한 프로세서에서 "비교" 명령어는 두 값을 평가하고 플래그 레지스터의 비트를 설정하거나 지워서 어느 값이 더 큰지 또는 동일한지를 나타낸다. 이 플래그 중 하나는 나중에 점프 명령어가 프로그램 흐름을 결정하는 데 사용될 수 있다.

가져오기

가져오기는 프로그램 메모리에서 명령(숫자 또는 숫자 시퀀스로 표현됨)을 검색하는 것을 포함한다. 프로그램 메모리에서 명령의 위치(주소)는 다음에 가져올 명령의 주소를 식별하는 숫자를 저장하는 프로그램 카운터(PC; 인텔 X86 마이크로프로세서에서는 "명령 포인터"라고 불림)에 의해 결정된다. 명령이 가져와진 후, PC는 명령의 길이만큼 증가하여 시퀀스의 다음 명령 주소를 포함하게 된다.[d] 종종 가져올 명령은 상대적으로 느린 메모리에서 검색해야 하므로, 명령이 반환되기를 기다리는 동안 CPU가 정지하게 된다. 이 문제는 캐시 및 파이프라인 아키텍처(아래 참조)에 의해 최신 프로세서에서 크게 해결되었다.

디코딩

CPU가 메모리에서 가져오는 명령어는 CPU가 무엇을 할지 결정한다. 복호화 회로로 알려진 명령어 디코더에 의해 수행되는 디코딩 단계에서, 명령어는 CPU의 다른 부분을 제어하는 신호로 변환된다.

명령어가 해석되는 방식은 CPU의 명령어 집합 아키텍처(ISA)에 의해 정의된다.[e] 종종 명령어 내의 비트 그룹("필드"라고 불림) 중 하나인 연산 코드는 수행할 연산을 나타내고, 나머지 필드는 일반적으로 연산에 필요한 추가 정보, 예를 들어 피연산자를 제공한다. 이러한 피연산자는 상수 값(즉시 값이라고 함)으로 지정되거나, 일부 주소 지정 방식에 의해 결정되는 프로세서 레지스터 또는 메모리 주소일 수 있다.

일부 CPU 설계에서는 명령어 디코더가 하드웨어로 고정된, 변경 불가능한 복호화 회로로 구현된다. 다른 설계에서는 마이크로코드가 명령어를 여러 클럭 펄스에 걸쳐 순차적으로 적용되는 CPU 구성 신호 세트로 변환하는 데 사용된다. 경우에 따라 마이크로코드를 저장하는 메모리는 다시 쓸 수 있어 CPU가 명령어를 디코딩하는 방식을 변경할 수 있다.

실행

가져오기 및 디코딩 단계 후에는 실행 단계가 수행된다. CPU 아키텍처에 따라 단일 동작 또는 일련의 동작으로 구성될 수 있다. 각 동작 동안 제어 신호는 CPU의 다양한 부분을 전기적으로 활성화하거나 비활성화하여 원하는 연산의 전부 또는 일부를 수행할 수 있도록 한다. 그런 다음 동작은 일반적으로 클럭 펄스에 반응하여 완료된다. 종종 결과는 후속 명령어가 빠르게 접근할 수 있도록 내부 CPU 레지스터에 기록된다. 다른 경우에는 결과가 더 느리지만 비용이 적게 들고 용량이 큰 주기억장치에 기록될 수 있다.

예를 들어, 덧셈을 수행하는 명령어가 실행될 경우, 피연산자(합산될 숫자)를 포함하는 레지스터와 덧셈을 수행하는 산술 논리 장치(ALU)의 일부가 활성화된다. 클럭 펄스가 발생하면 피연산자는 원본 레지스터에서 ALU로 흘러가고, 합계가 ALU의 출력에 나타난다. 후속 클럭 펄스에서 다른 구성 요소는 출력을 저장 장치(예: 레지스터 또는 메모리)로 이동시키기 위해 활성화(및 비활성화)된다. 만약 결과 합계가 너무 크면(즉, ALU의 출력 워드 크기보다 크면) 산술 오버플로 플래그가 설정되어 다음 연산에 영향을 미친다.

Remove ads

구조와 구현

요약
관점
Thumb
기본적인 단일 프로세서 CPU 컴퓨터의 블록 다이어그램. 검은색 선은 데이터 흐름을, 빨간색 선은 제어 흐름을 나타내며, 화살표는 흐름 방향을 나타낸다.

CPU의 회로에 하드웨어로 내장된 기본적인 연산 집합을 명령어 집합이라고 한다. 이러한 연산에는 예를 들어 두 숫자를 더하거나 빼는 것, 두 숫자를 비교하는 것, 또는 프로그램의 다른 부분으로 점프하는 것 등이 포함될 수 있다. 각 명령어는 기계어 연산 코드라고 알려진 고유한 비트 조합으로 표현된다. 명령어를 처리하는 동안 CPU는 연산 코드를 복호화하여 CPU의 동작을 조율하는 제어 신호로 변환한다. 완전한 기계어 명령어는 연산 코드와, 많은 경우 연산에 필요한 추가 비트(예: 덧셈 연산의 경우 합산될 숫자)로 구성된다. 복잡성 스케일을 올리면 기계어 프로그램은 CPU가 실행하는 기계어 명령어들의 모음이다.

각 명령어에 대한 실제 수학 연산은 CPU 프로세서 내의 조합 논리 회로인 산술 논리 장치(ALU)에 의해 수행된다. 일반적으로 CPU는 메모리에서 명령어를 가져와 ALU를 사용하여 연산을 수행한 다음, 결과를 메모리에 저장한다. 정수 수학 및 논리 연산 외에도, 메모리에서 데이터를 로드하고 다시 저장하는 명령어, 분기 연산, 그리고 CPU의 부동소수점 장치(FPU)에 의해 수행되는 부동소수점 연산과 같은 다양한 다른 기계 명령어가 존재한다.[69]

제어 장치

제어 장치(CU)는 프로세서의 작동을 지시하는 CPU의 구성 요소이다. 이는 컴퓨터의 메모리, 산술 논리 장치 및 입출력 장치에 프로세서로 전송된 명령에 응답하는 방법을 알려준다.

이는 타이밍 및 제어 신호를 제공하여 다른 장치의 작동을 지시한다. 대부분의 컴퓨터 자원은 CU에 의해 관리된다. 이는 CPU와 다른 장치 간의 데이터 흐름을 지시한다. 존 폰 노이만폰 노이만 구조의 일부로 제어 장치를 포함했다. 현대 컴퓨터 설계에서 제어 장치는 일반적으로 CPU의 내부 부분이며, 도입 이후 전반적인 역할과 작동은 변하지 않았다.[70]

산술 논리 장치

Thumb
ALU 및 그 입출력 신호의 상징적인 표현

산술 논리 장치(ALU)는 정수 산술 및 비트 논리 연산을 수행하는 프로세서 내의 디지털 회로이다. ALU의 입력은 연산될 데이터 워드(피연산자라고 함), 이전 연산의 상태 정보, 그리고 제어 장치로부터 어떤 연산을 수행할지 지시하는 코드이다. 실행되는 명령에 따라 피연산자는 내부 CPU 레지스터, 외부 메모리 또는 ALU 자체에서 생성된 상수로부터 올 수 있다.

모든 입력 신호가 안정되고 ALU 회로를 통해 전파되면, 수행된 연산의 결과가 ALU의 출력에 나타난다. 결과는 레지스터나 메모리에 저장될 수 있는 데이터 워드와 일반적으로 이 목적을 위해 예약된 특수 내부 CPU 레지스터에 저장되는 상태 정보로 구성된다.

최신 CPU는 성능 향상을 위해 일반적으로 하나 이상의 ALU를 포함한다.

주소 생성 장치

주소 생성 장치(AGU)는 때때로 주소 계산 장치(ACU)라고도 불리는데,[71] CPU가 메인 메모리에 접근하는 데 사용하는 주소를 계산하는 CPU 내부의 실행 장치이다. 주소 계산을 CPU의 나머지 부분과 병렬로 작동하는 별도의 회로로 처리함으로써 다양한 기계어 명령어를 실행하는 데 필요한 CPU 사이클 수가 줄어들어 성능 향상을 가져올 수 있다.

다양한 연산을 수행하는 동안 CPU는 메모리에서 데이터를 가져오는 데 필요한 메모리 주소를 계산해야 한다. 예를 들어, 배열 요소의 메모리 내 위치는 CPU가 실제 메모리 위치에서 데이터를 가져오기 전에 계산되어야 한다. 이러한 주소 생성 계산에는 덧셈, 뺄셈, 모듈로 연산, 또는 비트 시프트와 같은 다양한 정수 산술 연산이 포함된다. 종종 메모리 주소를 계산하는 것은 하나 이상의 범용 기계 명령어를 포함하며, 이는 반드시 빠르게 디코딩 및 실행되지 않는다. CPU 설계에 AGU를 통합하고 AGU를 사용하는 특수 명령어를 도입함으로써 다양한 주소 생성 계산을 CPU의 나머지 부분에서 오프로드할 수 있으며, 종종 단일 CPU 사이클 내에서 빠르게 실행될 수 있다.

AGU의 기능은 특정 CPU와 그 아키텍처에 따라 다르다. 따라서 일부 AGU는 더 많은 주소 계산 연산을 구현하고 노출하는 반면, 일부는 한 번에 여러 피연산자에 대해 작동할 수 있는 더 고급 전문 명령어도 포함한다. 일부 CPU 아키텍처는 여러 AGU를 포함하여 두 개 이상의 주소 계산 연산이 동시에 실행될 수 있도록 하며, 이는 고급 CPU 설계의 슈퍼스칼라 특성으로 인해 추가적인 성능 향상을 가져온다. 예를 들어, 인텔샌디브리지하스웰 마이크로아키텍처에 여러 AGU를 통합하여 여러 메모리 접근 명령어를 병렬로 실행할 수 있도록 함으로써 CPU 메모리 서브시스템의 대역폭을 증가시킨다.

메모리 관리 장치 (MMU)

많은 마이크로프로세서(스마트폰 및 데스크톱, 노트북, 서버 컴퓨터에 사용됨)에는 메모리 관리 장치가 있어, 논리적 주소를 물리적 RAM 주소로 변환하고, 메모리 보호페이징 기능을 제공하며, 이는 가상 메모리에 유용하다. 더 간단한 프로세서, 특히 마이크로컨트롤러는 일반적으로 MMU를 포함하지 않는다.

캐시

CPU 캐시[72]컴퓨터의 중앙 처리 장치(CPU)가 주기억장치에서 데이터에 접근하는 평균 비용(시간 또는 에너지)을 줄이기 위해 사용하는 하드웨어 캐시이다. 캐시는 프로세서 코어에 더 가깝고 더 빠르며 작은 메모리로, 자주 사용되는 주 메모리 위치의 데이터 사본을 저장한다. 대부분의 CPU는 명령어 캐시데이터 캐시를 포함하여 서로 다른 독립적인 캐시를 가지며, 데이터 캐시는 일반적으로 여러 캐시 레벨(L1, L2, L3, L4 등)의 계층 구조로 구성된다. 각 상위 캐시 레벨은 일반적으로 이전 레벨보다 느리지만 크며, L1이 가장 빠르고 CPU에 가장 가깝다.

모든 현대 (빠른) CPU는 (몇 가지 특수한 예외를 제외하고[f] ) 여러 수준의 CPU 캐시를 가지고 있다. 캐시를 사용한 최초의 CPU는 하나의 캐시 수준만 가졌다. 나중에 등장한 레벨 1 캐시와 달리 L1d(데이터용)와 L1i(명령어용)로 분할되지 않았다. 현재 캐시를 사용하는 거의 모든 CPU는 분할된 L1 캐시를 가지고 있다. 또한 L2 캐시와 더 큰 프로세서의 경우 L3 캐시도 가지고 있다. L2 캐시는 일반적으로 분할되지 않고 이미 분할된 L1 캐시의 공통 저장소 역할을 한다. 멀티 코어 프로세서의 각 코어는 전용 L2 캐시를 가지며 일반적으로 코어 간에 공유되지 않는다. L3 캐시 및 더 높은 수준의 캐시는 코어 간에 공유되며 분할되지 않는다. L4 캐시는 현재 흔하지 않으며, 일반적으로 별도의 다이 또는 칩에 있는 SRAM이 아닌 DRAM에 있다. 이는 역사적으로 L1에서도 마찬가지였지만, 더 큰 칩은 마지막 레벨을 제외하고 모든 캐시 레벨을 통합할 수 있게 했다. 각 추가 캐시 레벨은 더 크고 다르게 최적화되는 경향이 있다.

대부분의 CPU가 가지고 있는 메모리 관리 장치(MMU)의 일부인 변환 색인 버퍼(TLB)와 같이 다른 유형의 캐시도 존재한다(위에서 언급한 가장 중요한 캐시의 "캐시 크기"에는 포함되지 않음).

캐시는 일반적으로 2의 거듭제곱(예: 2, 8, 16 등 키비바이트 또는 메비바이트(더 큰 비L1 캐시의 경우) 크기로 되어 있지만, IBM z13은 96 KiB의 L1 명령어 캐시를 가지고 있다.[73]

클럭 속도

대부분의 CPU는 동기 회로이다. 이는 순차적인 연산의 속도를 조절하기 위해 클럭 신호를 사용한다는 것을 의미한다. 클럭 신호는 외부 발진 회로에 의해 생성되며, 이 회로는 주기적인 방형파 형태로 초당 일정한 수의 펄스를 생성한다. 클럭 펄스의 주파수는 CPU가 명령어를 실행하는 속도를 결정하며, 결과적으로 클럭이 빠를수록 CPU는 초당 더 많은 명령어를 실행한다.

CPU의 적절한 작동을 보장하기 위해 클럭 주기는 모든 신호가 CPU를 통해 전파(이동)하는 데 필요한 최대 시간보다 길다. 클럭 주기를 최악의 전달 지연보다 훨씬 높은 값으로 설정함으로써, 전체 CPU와 CPU가 상승 및 하강하는 클럭 신호의 "가장자리"를 따라 데이터를 이동시키는 방식을 설계할 수 있다. 이는 설계 관점과 부품 수 관점 모두에서 CPU를 크게 단순화하는 장점이 있다. 그러나 이는 CPU의 일부 부분이 훨씬 빠르더라도 전체 CPU가 가장 느린 요소들을 기다려야 한다는 단점도 수반한다. 이러한 한계는 CPU 병렬성을 높이는 다양한 방법(아래 참조)에 의해 크게 보완되었다.

그러나 아키텍처 개선만으로는 전역 동기 CPU의 모든 단점을 해결할 수 없다. 예를 들어, 클럭 신호는 다른 전기 신호의 지연에 영향을 받는다. 점점 더 복잡해지는 CPU에서 높은 클럭 속도는 전체 장치에서 클럭 신호의 위상(동기화)을 유지하기 어렵게 만든다. 이로 인해 많은 현대 CPU는 단일 신호가 CPU 오작동을 유발할 정도로 크게 지연되는 것을 방지하기 위해 여러 개의 동일한 클럭 신호가 제공되어야 한다.[74] 클럭 속도가 급격히 증가함에 따라 또 다른 주요 문제는 CPU에서 소산되는 열량이다. 지속적으로 변하는 클럭은 사용 여부와 관계없이 많은 구성 요소를 전환시킨다. 일반적으로 전환하는 구성 요소는 정적 상태의 요소보다 더 많은 에너지를 사용한다. 따라서 클럭 속도가 증가할수록 에너지 소비도 증가하여 CPU는 CPU 냉각 솔루션 형태의 더 많은 열 방출을 필요로 한다.

불필요한 구성 요소의 스위칭을 처리하는 한 가지 방법은 클럭 게이팅이라고 불리며, 이는 불필요한 구성 요소에 대한 클럭 신호를 차단하는 것(실질적으로 비활성화)을 포함한다. 그러나 이는 구현하기 어렵다고 여겨지며, 따라서 매우 낮은 전력 설계 외에는 일반적인 용도로 사용되지 않는다. 광범위한 클럭 게이팅을 사용하는 주목할 만한 최근 CPU 설계 중 하나는 엑스박스 360에 사용된 IBM 파워PC 기반 제논이다. 이는 엑스박스 360의 전력 요구 사항을 줄인다.[75]

클럭 없는 CPU

전역 클럭 신호의 일부 문제를 해결하는 또 다른 방법은 클럭 신호를 아예 없애는 것이다. 전역 클럭 신호를 제거하면 여러 면에서 설계 프로세스가 상당히 복잡해지지만, 비동기(또는 클럭 없는) 설계는 유사한 동기 설계에 비해 전력 소비 및 열 방출 측면에서 뚜렷한 장점을 제공한다. 다소 흔하지는 않지만, 전역 클럭 신호를 사용하지 않고 완전한 비동기 CPU가 구축되기도 했다. 이 중 주목할 만한 두 가지 예로는 ARM 호환 AMULETMIPS R3000 호환 MiniMIPS가 있다.[76]

클럭 신호를 완전히 제거하는 대신, 일부 CPU 설계는 장치의 특정 부분이 비동기식으로 작동하도록 허용한다. 예를 들어, 비동기식 ALU와 슈퍼스칼라 파이프라인을 함께 사용하여 일부 산술 성능 향상을 달성하는 식이다. 완전히 비동기식 설계가 동기식 설계와 유사하거나 더 나은 수준의 성능을 발휘할 수 있는지 여부는 아직 명확하지 않지만, 최소한 간단한 수학 연산에서는 탁월한 성능을 보여준다. 이러한 점은 우수한 전력 소비 및 열 방출 특성과 결합되어 임베디드 컴퓨터에 매우 적합하게 만든다.[77]

전압 조정 모듈

많은 현대 CPU는 다이 통합 전력 관리 모듈을 가지고 있으며, 이는 CPU 회로에 온디맨드 전압 공급을 조절하여 성능과 전력 소비의 균형을 유지할 수 있도록 한다.

정수 범위

모든 CPU는 수치 값을 특정 방식으로 표현한다. 예를 들어, 일부 초기 디지털 컴퓨터는 숫자를 친숙한 10진법 기수법 값으로 표현했으며, 다른 컴퓨터는 2-5진법 또는 3진법과 같은 더 특이한 표현을 사용하기도 했다. 거의 모든 현대 CPU는 숫자를 이진 형태로 표현하며, 각 숫자는 "높음" 또는 "낮음" 전압과 같은 두 값의 물리량으로 표현된다.[g]

Thumb
십진수 40의 이진 인코딩 표현을 포함하는 6비트 워드. 대부분의 현대 CPU는 8, 16, 32 또는 64비트와 같이 2의 거듭제곱인 워드 크기를 사용한다.

수치 표현과 관련하여 CPU가 표현할 수 있는 정수 숫자의 크기와 정밀도가 있다. 이진 CPU의 경우, 이는 CPU가 한 번의 연산으로 처리할 수 있는 비트 수(이진 인코딩된 정수의 유효 숫자)로 측정되며, 일반적으로 워드 크기, 비트 너비, 데이터 경로 너비, 정수 정밀도 또는 정수 크기라고 불린다. CPU의 정수 크기는 CPU가 직접 작동할 수 있는 정수 값의 범위를 결정한다.[h] 예를 들어, 8비트 CPU는 8비트로 표현되는 정수를 직접 조작할 수 있으며, 이는 256(28)개의 이산 정수 값의 범위를 가진다.

정수 범위는 CPU가 직접 주소 지정할 수 있는 메모리 위치의 수에도 영향을 미칠 수 있다(주소는 특정 메모리 위치를 나타내는 정수 값임). 예를 들어, 이진 CPU가 메모리 주소를 나타내는 데 32비트를 사용하면 232개의 메모리 위치를 직접 주소 지정할 수 있다. 이러한 한계를 우회하고 다양한 다른 이유로 인해 일부 CPU는 추가 메모리를 주소 지정할 수 있는 메커니즘(메모리 관리 또는 뱅크 전환과 같은)을 사용한다.

워드 크기가 큰 CPU는 더 많은 회로를 필요로 하므로 물리적으로 더 크고, 비용이 더 많이 들며, 더 많은 전력을 소비한다(따라서 더 많은 열을 발생시킨다). 그 결과, 훨씬 더 큰 워드 크기(예: 16, 32, 64, 심지어 128비트)의 CPU를 사용할 수 있음에도 불구하고, 더 작은 4비트 또는 8비트 마이크로컨트롤러가 현대 애플리케이션에서 흔히 사용된다. 그러나 더 높은 성능이 요구될 때는 더 큰 워드 크기의 이점(더 넓은 데이터 범위 및 주소 공간)이 단점을 능가할 수 있다. CPU는 크기와 비용을 줄이기 위해 워드 크기보다 짧은 내부 데이터 경로를 가질 수 있다. 예를 들어, IBM 시스템/360명령어 집합은 32비트 명령어 집합이었지만, 시스템/360 모델 30모델 40은 산술 논리 장치에 8비트 데이터 경로를 가지고 있었으므로, 32비트 덧셈은 피연산자의 각 8비트마다 한 사이클씩 총 4사이클이 필요했다. 그리고 모토로라 68000 시리즈 명령어 집합은 32비트 명령어 집합이었지만, 모토로라 68000모토로라 68010은 산술 논리 장치에 16비트 데이터 경로를 가지고 있었으므로, 32비트 덧셈은 두 사이클이 필요했다.

더 낮은 비트 길이와 더 높은 비트 길이 모두의 이점을 얻기 위해, 많은 명령어 집합은 정수 및 부동소수점 데이터에 대해 다른 비트 너비를 가지며, 해당 명령어 집합을 구현하는 CPU가 장치의 다른 부분에 대해 다른 비트 너비를 가질 수 있도록 한다. 예를 들어, IBM 시스템/360 명령어 집합은 주로 32비트였지만, 부동소수점 숫자의 정확성과 범위 확장을 용이하게 하기 위해 64비트 부동소수점 값을 지원했다.[37] 시스템/360 모델 65는 십진 및 고정 소수점 이진 산술을 위한 8비트 가산기와 부동소수점 산술을 위한 60비트 가산기를 가졌다.[78] 많은 후기 CPU 설계는 유사한 혼합 비트 너비를 사용하는데, 특히 프로세서가 정수 및 부동소수점 기능의 합리적인 균형이 요구되는 범용 용도로 사용될 때 그렇다.

병렬성

Thumb
세 가지 명령을 완료하는 데 15클럭 사이클이 걸리는 서브스칼라 CPU 모델

이전 섹션에서 설명한 CPU의 기본 작동 방식은 CPU가 취할 수 있는 가장 간단한 형태를 설명한다. 일반적으로 서브스칼라라고 불리는 이러한 유형의 CPU는 한 번에 하나 또는 두 개의 데이터 조각에 대해 하나의 명령을 작동하고 실행한다. 즉, 클럭 사이클당 명령어 처리 횟수(IPC < 1)가 1 미만이다.

이러한 과정은 서브스칼라 CPU에서 본질적인 비효율성을 야기한다. 한 번에 하나의 명령어만 실행되기 때문에, 전체 CPU는 다음 명령어로 진행하기 전에 해당 명령어가 완료될 때까지 기다려야 한다. 결과적으로 서브스칼라 CPU는 실행을 완료하는 데 한 클럭 사이클 이상이 걸리는 명령어에서 "멈추게" 된다. 두 번째 실행 장치를 추가해도(아래 참조) 성능이 크게 향상되지 않는다. 한 경로가 멈추는 대신 이제 두 경로가 멈추고 사용되지 않는 트랜지스터 수가 증가한다. CPU의 실행 리소스가 한 번에 하나의 명령만 작동할 수 있는 이러한 설계는 스칼라 성능(클럭 사이클당 하나의 명령어, IPC = 1)에만 도달할 수 있다. 그러나 성능은 거의 항상 서브스칼라(클럭 사이클당 명령어 처리 횟수 1 미만, IPC < 1)이다.

스칼라 및 그 이상의 성능을 달성하려는 시도는 CPU가 선형적으로 작동하는 대신 병렬적으로 작동하도록 하는 다양한 설계 방법론을 낳았다. CPU의 병렬성을 언급할 때, 이러한 설계 기술을 분류하는 데 두 가지 용어가 일반적으로 사용된다:

각 방법론은 구현 방식과 애플리케이션의 CPU 성능 향상에 미치는 상대적인 효과 측면에서 다르다.[i]

명령어 수준 병렬성

Thumb
기본 5단계 파이프라인. 최상의 시나리오에서 이 파이프라인은 클럭 사이클당 하나의 명령어 완료율을 유지할 수 있다.

병렬성 증가를 위한 가장 간단한 방법 중 하나는 이전 명령어가 실행을 마치기 전에 명령어 가져오기 및 디코딩의 첫 단계를 시작하는 것이다. 이는 명령어 파이프라인이라고 알려진 기술이며, 거의 모든 현대 범용 CPU에서 사용된다. 파이프라이닝은 실행 경로를 이산적인 단계로 분할함으로써 여러 명령어를 동시에 실행할 수 있도록 한다. 이러한 분리는 조립 라인에 비유될 수 있으며, 각 단계에서 명령어가 더 완성되어 실행 파이프라인을 벗어나 은퇴된다.

그러나 파이프라이닝은 다음 작업을 완료하는 데 이전 작업의 결과가 필요한 상황을 발생시킬 수 있다. 이러한 상황을 종종 데이터 종속성 충돌이라고 부른다. 따라서 파이프라인 프로세서는 이러한 종류의 조건을 확인하고 필요한 경우 파이프라인의 일부를 지연시켜야 한다. 파이프라인 프로세서는 파이프라인 스톨(명령어가 한 단계에서 한 클럭 사이클 이상을 소비하는 경우)에 의해서만 저해되어 거의 스칼라에 가까워질 수 있다.

Thumb
간단한 슈퍼스칼라 파이프라인. 한 번에 두 명령어를 가져와 디스패치함으로써 클럭 사이클당 최대 두 명령어를 완료할 수 있다.

명령어 파이프라이닝의 개선은 CPU 구성 요소의 유휴 시간 감소로 이어졌다. 슈퍼스칼라라고 불리는 설계에는 긴 명령어 파이프라인과 로드-스토어 장치, 산술 논리 장치, 부동소수점 장치, 주소 생성 장치와 같은 여러 개의 동일한 실행 장치가 포함된다.[79] 슈퍼스칼라 파이프라인에서 명령어는 읽혀져 디스패처로 전달되며, 디스패처는 명령어를 병렬(동시)로 실행할 수 있는지 여부를 결정한다. 만약 가능하다면, 명령어는 실행 장치로 디스패치되어 동시 실행된다. 일반적으로 슈퍼스칼라 CPU가 한 사이클에 완료할 명령어 수는 동시에 실행 장치로 디스패치할 수 있는 명령어 수에 따라 달라진다.

슈퍼스칼라 CPU 아키텍처 설계의 가장 큰 어려움은 효율적인 디스패처를 만드는 데 있다. 디스패처는 명령어를 병렬로 실행할 수 있는지 여부를 신속하게 결정할 수 있어야 하며, 가능한 한 많은 실행 장치를 바쁘게 유지하는 방식으로 명령어를 디스패치해야 한다. 이를 위해서는 명령어 파이프라인이 가능한 한 자주 채워져야 하며, 상당한 양의 CPU 캐시가 필요하다. 또한 분기 예측, 투기적 실행, 레지스터 이름 변경, 비순차적 명령어 처리트랜잭셔널 메모리와 같은 해저드 회피 기술이 높은 수준의 성능을 유지하는 데 중요하다. 조건부 명령어가 어떤 분기(또는 경로)를 택할지 예측하려고 시도함으로써 CPU는 전체 파이프라인이 조건부 명령어가 완료될 때까지 기다려야 하는 횟수를 최소화할 수 있다. 투기적 실행은 조건부 연산이 완료된 후 필요하지 않을 수도 있는 코드 부분을 실행함으로써 종종 미미한 성능 향상을 제공한다. 비순차적 명령어 처리는 데이터 종속성으로 인한 지연을 줄이기 위해 명령어 실행 순서를 다소 재정렬한다. 또한 단일 명령어 스트림, 다중 데이터 스트림의 경우, 동일한 유형의 많은 데이터를 처리해야 할 때, 현대 프로세서는 파이프라인의 일부를 비활성화하여 단일 명령어가 여러 번 실행될 때 CPU가 가져오기 및 디코딩 단계를 건너뛰고 특정 경우, 특히 비디오 제작 소프트웨어 및 사진 처리와 같은 고도로 단조로운 프로그램 엔진에서 성능을 크게 향상시킬 수 있다.

CPU의 일부가 슈퍼스칼라일 때, 그렇지 않은 부분은 스케줄링 스톨로 인해 성능 저하를 겪는다. P5 펜티엄은 클럭 사이클당 하나의 명령어를 받아들일 수 있는 두 개의 슈퍼스칼라 ALU를 가졌지만, FPU는 그러지 못했다. 따라서 P5는 정수 슈퍼스칼라였지만 부동소수점 슈퍼스칼라는 아니었다. P5 아키텍처의 후속 모델인 인텔의 P6는 부동소수점 기능에 슈퍼스칼라 기능을 추가했다.

간단한 파이프라이닝과 슈퍼스칼라 설계는 CPU가 클럭 사이클당 한 명령어 이상의 속도로 명령어를 실행할 수 있도록 하여 CPU의 ILP를 증가시킨다. 대부분의 현대 CPU 설계는 적어도 어느 정도는 슈퍼스칼라이며, 지난 10년 동안 설계된 거의 모든 범용 CPU는 슈퍼스칼라이다. 최근 몇 년 동안 고성능 ILP 컴퓨터 설계의 일부 초점은 CPU 하드웨어에서 소프트웨어 인터페이스 또는 명령어 집합(ISA)으로 옮겨졌다. 매우 긴 명령어 워드(VLIW) 전략은 일부 ILP가 소프트웨어에 의해 직접 암시되도록 하여 ILP를 높이는 CPU의 작업을 줄이고 설계 복잡성을 줄인다.

작업 수준 병렬성

성능을 달성하기 위한 또 다른 전략은 여러 스레드 또는 프로세스를 병렬로 실행하는 것이다. 이 연구 분야는 병렬 컴퓨팅으로 알려져 있다.[80] 플린 분류에서 이 전략은 다중 명령어 스트림, 다중 데이터 스트림(MIMD)으로 알려져 있다.[81]

이를 위해 사용되는 한 가지 기술은 다중 처리(MP)이다.[82] 이 기술의 초기 유형은 대칭형 다중 처리(SMP)로 알려져 있으며, 소수의 CPU가 메모리 시스템의 일관된 뷰를 공유한다. 이 방식에서 각 CPU는 메모리의 최신 뷰를 지속적으로 유지하기 위한 추가 하드웨어를 가지고 있다. 메모리의 오래된 뷰를 피함으로써 CPU는 동일한 프로그램에서 협력할 수 있으며 프로그램은 한 CPU에서 다른 CPU로 마이그레이션할 수 있다. 소수를 넘어 협력하는 CPU의 수를 늘리기 위해 1990년대에는 불균일 기억 장치 접근(NUMA) 및 디렉토리 기반 일관성 프로토콜(directory-based coherence protocols)과 같은 방식이 도입되었다. SMP 시스템은 소수의 CPU로 제한되는 반면 NUMA 시스템은 수천 개의 프로세서로 구축되었다. 처음에는 다중 처리가 여러 개의 개별 CPU와 보드를 사용하여 프로세서 간의 상호 연결을 구현했다. 프로세서와 그 상호 연결이 모두 단일 칩에 구현될 때, 이 기술은 칩 수준 다중 처리(CMP)로 알려져 있으며, 단일 칩은 멀티 코어 프로세서라고 불린다.

나중에 단일 프로그램에도 더 세밀한 병렬성이 존재한다는 것이 인식되었다. 단일 프로그램은 여러 스레드(또는 함수)를 가질 수 있으며, 이들은 별도로 또는 병렬로 실행될 수 있다. 이 기술의 초기 사례 중 일부는 직접 메모리 접근과 같은 입출력 처리를 계산 스레드와 별개의 스레드로 구현했다. 이 기술에 대한 더 일반적인 접근 방식은 1970년대에 시스템이 여러 계산 스레드를 병렬로 실행하도록 설계되었을 때 도입되었다. 이 기술은 멀티스레딩으로 알려져 있다. 이 접근 방식은 MP의 경우 전체 CPU와 달리 CPU 내의 소수의 구성 요소만 복제하여 MT를 지원하므로 다중 처리보다 비용 효율적인 것으로 간주된다. MT에서는 실행 장치와 캐시를 포함한 메모리 시스템이 여러 스레드 간에 공유된다. MT의 단점은 멀티스레딩에 대한 하드웨어 지원이 MP보다 소프트웨어에 더 많이 노출되어 운영 체제와 같은 감독 소프트웨어가 MT를 지원하기 위해 더 큰 변경을 겪어야 한다는 것이다. 구현된 MT의 한 유형은 시간적 멀티스레딩으로, 외부 메모리에서 데이터가 반환되기를 기다리며 스톨될 때까지 하나의 스레드가 실행된다. 이 방식에서 CPU는 실행 준비가 된 다른 스레드로 빠르게 컨텍스트 스위칭하며, 스위칭은 종종 울트라SPARC T1과 같이 한 CPU 클럭 사이클 내에서 이루어진다. 다른 유형의 MT는 동시 멀티스레딩으로, 여러 스레드의 명령어가 한 CPU 클럭 사이클 내에서 병렬로 실행된다.

1970년대부터 2000년대 초반까지 수십 년 동안 고성능 범용 CPU 설계의 초점은 주로 파이프라이닝, 캐시, 슈퍼스칼라 실행, 비순차적 실행 등과 같은 기술을 통해 높은 ILP를 달성하는 데 있었다. 이러한 추세는 펜티엄 4와 같은 크고 전력을 많이 소비하는 CPU로 절정을 이루었다. 2000년대 초반에는 CPU 작동 주파수와 주 메모리 작동 주파수 간의 격차 확대와 더불어 더욱 난해한 ILP 기술로 인한 CPU 전력 소모 증가로 인해 CPU 설계자들은 ILP 기술을 통한 더 높은 성능 달성에서 좌절을 겪었다.

그 후 CPU 설계자들은 트랜잭션 처리와 같은 상업용 컴퓨팅 시장에서 아이디어를 빌려왔다. 이러한 시장에서는 여러 프로그램의 총체적 성능, 즉 처리량 컴퓨팅이 단일 스레드 또는 프로세스의 성능보다 더 중요했다.

이러한 강조점의 역전은 듀얼 및 그 이상의 코어 프로세서 설계의 확산과 특히 인텔의 덜 슈퍼스칼라적인 P6 아키텍처와 유사한 새로운 설계에서 입증된다. 여러 프로세서 제품군의 최신 설계는 엑스박스 360의 트리플 코어 파워PC 설계와 플레이스테이션 3의 7코어 셀 마이크로프로세서와 같은 비디오 게임 콘솔 CPU를 포함하여 칩 수준 다중 처리를 특징으로 한다.

데이터 병렬성

덜 흔하지만 점점 더 중요해지는 프로세서(및 실제로 일반 컴퓨팅) 패러다임은 데이터 병렬성을 다룬다. 앞서 논의된 프로세서들은 모두 어떤 종류의 스칼라 장치로 언급된다.[j] 이름에서 알 수 있듯이 벡터 프로세서는 하나의 명령어 컨텍스트에서 여러 데이터 조각을 처리한다. 이는 각 명령어마다 하나의 데이터 조각을 처리하는 스칼라 프로세서와 대조된다. 플린 분류를 사용하여, 이러한 두 가지 데이터 처리 방식은 일반적으로 단일 명령어 스트림, 다중 데이터 스트림(SIMD) 및 단일 명령어 스트림, 단일 데이터 스트림(SISD)이라고 각각 불린다. 데이터 벡터를 처리하는 프로세서를 만드는 데 엄청난 유용성이 있는 이유는 대량의 데이터 세트에 대해 동일한 연산(예: 합계 또는 스칼라곱)을 수행해야 하는 경향이 있는 작업을 최적화하는 데 있다. 이러한 유형의 작업의 일부 고전적인 예로는 멀티미디어 애플리케이션(이미지, 비디오 및 사운드)뿐만 아니라 많은 유형의 과학 및 엔지니어링 작업이 있다. 스칼라 프로세서는 데이터 세트의 각 명령어와 값에 대한 가져오기, 디코딩 및 실행의 전체 프로세스를 완료해야 하는 반면, 벡터 프로세서는 하나의 명령으로 비교적 큰 데이터 세트에 대해 단일 연산을 수행할 수 있다. 이는 애플리케이션이 많은 단계를 필요로 하고 하나의 연산을 큰 데이터 세트에 적용하는 경향이 있을 때만 가능하다.

크레이-1과 같은 대부분의 초기 벡터 프로세서는 거의 전적으로 과학 연구 및 암호학 애플리케이션과 관련되어 있었다. 그러나 멀티미디어가 주로 디지털 미디어로 전환되면서 범용 프로세서에서 어떤 형태의 SIMD가 필요해졌다. 부동소수점 장치가 범용 프로세서에서 흔해지기 시작한 직후, SIMD 실행 장치에 대한 사양과 구현도 1990년대 중반에 범용 프로세서에 나타나기 시작했다. HP의 멀티미디어 가속 확장(MAX) 및 인텔의 MMX와 같은 이러한 초기 SIMD 사양 중 일부는 정수 전용이었다. 이는 일부 소프트웨어 개발자에게 상당한 장애물이 되었는데, SIMD의 이점을 누리는 많은 애플리케이션이 주로 부동소수점 숫자를 다루기 때문이었다. 점진적으로 개발자들은 이러한 초기 설계를 개선하고 재구성하여 현재의 일반적인 SIMD 사양 중 일부를 만들었으며, 이는 일반적으로 하나의 명령어 집합과 관련된다. 주목할 만한 현대적 예로는 인텔의 스트리밍 SIMD 확장(SSE)과 파워PC 관련 AltiVec(VMX로도 알려짐)이 있다.[k]

하드웨어 성능 카운터

많은 현대 아키텍처(임베디드 아키텍처 포함)는 종종 하드웨어 성능 카운터(HPC)를 포함하여 실행 중인 소프트웨어 메트릭의 저수준(명령어 수준) 수집, 벤치마킹, 디버깅 또는 분석을 가능하게 한다.[83][84] HPC는 또한 반환 지향형 프로그래밍(ROP) 또는 시그레턴 지향 프로그래밍(sigreturn-oriented programming, SROP) 익스플로잇 등과 같은 소프트웨어의 비정상적이거나 의심스러운 활동을 발견하고 분석하는 데 사용될 수 있다.[85] 이는 일반적으로 소프트웨어 보안 팀에서 악성 바이너리 프로그램을 평가하고 찾는 데 사용된다.[86]

많은 주요 벤더(예: IBM, 인텔, AMD, Arm)는 CPU의 하드웨어 레지스터에서 데이터를 수집하여 메트릭을 얻는 데 사용할 수 있는 소프트웨어 인터페이스(일반적으로 C/C++로 작성됨)를 제공한다.[87] 운영 체제 벤더는 또한 `perf`(리눅스)와 같은 소프트웨어를 제공하여 실행 중인 커널 및 애플리케이션의 CPU 이벤트를 기록하고, 벤치마킹하거나, 트레이싱한다.

하드웨어 카운터는 CPU의 핵심 요소(기능 단위, 캐시, 주기억장치 등)와 관련된 포괄적인 성능 메트릭을 수집하는 데 낮은 오버헤드를 제공하는 방법으로, 소프트웨어 프로파일러에 비해 상당한 이점이 있다.[88] 또한, 일반적으로 프로그램의 기본 소스 코드를 수정할 필요가 없다.[89] 하드웨어 설계는 아키텍처마다 다르기 때문에 하드웨어 카운터의 특정 유형과 해석도 달라진다.

Remove ads

특권 모드

대부분의 현대 CPU는 운영 체제와 가상화를 지원하기 위해 특권 모드를 가지고 있다.

클라우드 컴퓨팅은 가상화를 사용하여 별도의 사용자를 위한 가상 중앙 처리 장치[90](vCPU)를 제공할 수 있다.[91] vCPU는 가상 사설 서버(VPS)와 혼동해서는 안 된다.

호스트는 가상 시스템이 작동하는 물리적 머신과 같은 가상 시스템이다.[92] 여러 물리적 머신이 함께 작동하고 전체적으로 관리될 때, 그룹화된 컴퓨팅 및 메모리 자원은 클러스터를 형성한다. 일부 시스템에서는 클러스터에 동적으로 추가하고 제거할 수 있다. 호스트 및 클러스터 수준에서 사용 가능한 자원은 리소스 풀세분화될 수 있다.

성능

요약
관점

프로세서의 성능 또는 속도는 클럭 속도(일반적으로 헤르츠의 배수로 주어짐) 및 클럭당 명령어 수(IPC)를 비롯한 여러 요인에 따라 달라지며, 이들 요인들이 함께 CPU가 수행할 수 있는 초당 명령 수의 요인으로 작용한다.[93] 많은 보고된 IPS 값은 분기가 거의 없는 인위적인 명령어 시퀀스에서 "최고" 실행 속도를 나타내지만, 실제 작업 부하는 다양한 명령어와 애플리케이션의 혼합으로 구성되며, 일부는 다른 것보다 실행하는 데 더 오래 걸린다. 메모리 계층 구조의 성능 또한 프로세서 성능에 크게 영향을 미치며, 이는 IPS 계산에서 거의 고려되지 않는 문제이다. 이러한 문제 때문에 SPECint와 같이 이 목적을 위한  "벤치마크"라고 불리는 다양한 표준화된 테스트가 일반적으로 사용되는 애플리케이션에서 실제 유효 성능을 측정하기 위해 개발되었다.

컴퓨터의 처리 성능은 멀티 코어 프로세서를 사용하여 향상된다. 이는 본질적으로 두 개 이상의 개별 프로세서(이러한 맥락에서는 코어라고 함)를 하나의 집적 회로에 연결하는 것이다.[94] 이상적으로는 듀얼 코어 프로세서가 단일 코어 프로세서보다 거의 두 배 강력할 것이다. 실제로는 불완전한 소프트웨어 알고리즘 및 구현으로 인해 성능 향상은 훨씬 작아 약 50%에 불과하다.[95] 프로세서의 코어 수를 늘리면(예: 듀얼 코어, 쿼드 코어 등) 처리할 수 있는 작업량이 증가한다. 이는 프로세서가 이제 수많은 비동기 이벤트, 인터럽트 등을 처리할 수 있음을 의미하며, 이는 CPU가 과부하될 때 부담을 줄 수 있다. 이 코어는 처리 공장의 다른 층으로 생각할 수 있으며, 각 층은 다른 작업을 처리한다. 때때로 이 코어는 단일 코어만으로는 정보를 처리하기에 충분하지 않은 경우 인접한 코어와 동일한 작업을 처리한다. 멀티 코어 CPU는 추가 처리 능력을 제공함으로써 컴퓨터가 여러 작업을 동시에 실행하는 능력을 향상시킨다. 그러나 속도 증가는 추가된 코어 수에 정비례하지 않는다. 이는 코어들이 특정 채널을 통해 상호 작용해야 하며, 이러한 코어 간 통신이 사용 가능한 처리 속도의 일부를 소비하기 때문이다.[96]

동시 멀티스레딩언코어(uncore)와 같은 현대 CPU의 특정 기능(실제 CPU 자원을 공유하면서 활용도를 높이는 것을 목표로 함)으로 인해 성능 수준 및 하드웨어 사용 모니터링은 점차 복잡한 작업이 되었다.[97] 이에 대한 응답으로 일부 CPU는 CPU의 다양한 부분의 실제 사용을 모니터링하고 소프트웨어에서 접근 가능한 다양한 카운터를 제공하는 추가 하드웨어 논리를 구현한다. 예를 들어 인텔의 성능 카운터 모니터 기술이 있다.[9]

Remove ads

오버클럭

Thumb
OG(오리지널) 및 OC(오버클럭 가능)가 표시된 엔비디아-에이수스 Tuf GPU.

오버클럭은 CPU 성능을 높이기 위해 CPU(및 기타 구성 요소)의 클럭 속도를 높이는 과정이다. 오버클럭은 CPU 온도를 높여 과열을 유발할 수 있으므로, 대부분의 사용자는 오버클럭을 하지 않고 클럭 속도를 변경하지 않는다. 일부 구성 요소 버전(예: 인텔의 U 버전 CPU 또는 엔비디아의 OG GPU)은 오버클럭을 허용하지 않는다.

같이 보기

각주

외부 링크

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads