From ac25c33f818531c2134634b28baaffe7b5525782 Mon Sep 17 00:00:00 2001 From: ChangHwan Kim Date: Mon, 1 Jan 2024 13:22:13 +0900 Subject: [PATCH] update cpu post 2 --- .github/workflows/ci.yml | 2 +- .github/workflows/pages-deploy.yml | 2 +- .../2023-08-23-computer-hardware-3-cpu-2.md | 43 ++++++++++--------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee8187678ba..e2a3100375b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: 3 + ruby-version: 3.2.2 bundler-cache: true - name: Setup Node diff --git a/.github/workflows/pages-deploy.yml b/.github/workflows/pages-deploy.yml index 87089c92f05..c243f67274e 100644 --- a/.github/workflows/pages-deploy.yml +++ b/.github/workflows/pages-deploy.yml @@ -42,7 +42,7 @@ jobs: - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: 3 + ruby-version: 3.2.2 bundler-cache: true - name: Build site diff --git a/_posts/2023-08-23-computer-hardware-3-cpu-2.md b/_posts/2023-08-23-computer-hardware-3-cpu-2.md index 031d9da73d1..4544a2de7e1 100644 --- a/_posts/2023-08-23-computer-hardware-3-cpu-2.md +++ b/_posts/2023-08-23-computer-hardware-3-cpu-2.md @@ -34,7 +34,7 @@ ARM은 사업구조가 다소 독특한 편으로 자신들이 만든 레퍼런 ![](apple-m1.jpg){: w="300"} _Apple이 자체 제작하는 ARM 아키텍처 기반 CPU인 Apple M1_ -ARM 말고도 2010년대 이후로 각광을 받고 있는 ISA 중에는 [**RISC-V**](https://riscv.org/) 라는 ISA도 있습니다. RISC-V의 가장 큰 특징이라면 **ISA 자체가 오픈 소스**라는 것입니다. 기존 x86, x64, ARM 아키텍처들은 모두 회사에 종속된 아키텍처이고 다른 회사가 사용하려면 라이센스 비용이 발생했는데, RISC-V는 그런 제약이 없어서 어느 회사든 자유롭게 제품을 개발할 수 있어 임베디드 업계를 중심으로 조금씩 점유율을 늘려가고 있습니다. +ARM 말고도 2010년대 이후로 각광을 받고 있는 ISA 중에는 [**RISC-V**](https://riscv.org/) 라는 ISA도 있습니다. RISC-V의 가장 큰 특징이라면 **ISA 자체가 오픈 소스**라는 것입니다. 기존 x86, x64, ARM 아키텍처들은 모두 회사에 종속된 아키텍처이고 다른 회사가 사용하려면 라이센스 비용이 발생했는데[^1], RISC-V는 그런 제약이 없어서 어느 회사든 자유롭게 제품을 개발할 수 있어 임베디드 업계를 중심으로 조금씩 점유율을 늘려가고 있습니다. ![](arm-riscv.jpg){: w="500"} _ARM과 RISC-V_ @@ -45,7 +45,7 @@ _ARM과 RISC-V_ 지금까지 ISA를 얘기하면서 저는 CISC와 RISC라는 단어를 **의도적으로 배제**했는데, 전통적으로 ISA를 얘기할 때는 이 둘을 얘기하는 경우가 많습니다. -**CISC**와 **RISC**는 각각 **Complex Instruction Set Computer**와 **Reduced ISC**를 의미하는 것으로 ISA의 특징을 구분하기 위해 만들어진 용어입니다. [^1] +**CISC**와 **RISC**는 각각 **Complex Instruction Set Computer**와 **Reduced ISC**를 의미하는 것으로 ISA의 특징을 구분하기 위해 만들어진 용어입니다. [^2] 보통 x86과 x64 계열은 CISC, ARM과 RISC-V (이름 그 자체이기도 하지만..)는 RISC로 분류하는데, 이는 x86 계열 아키텍처가 복잡한 구조의 명령어를 가지고 있기 때문에 붙여진 이름입니다. 명령어 구조가 복잡하다는 것은 다양한 의미가 있겠지만 보통은 **서로 다른 명령어의 길이가 다르다**는 것을 의미합니다. 반대로 RISC는 대부분 명령어가 **같은 길이**를 갖게끔 설계합니다. 아래 그림은 앞서 예시로 보인 똑같은 `1 + 2 = 3` 프로그램을 x86 (CISC)과 RISC-V (RISC) 용으로 컴파일 했을 때 나오는 기계어를 비교한 것입니다. @@ -54,7 +54,7 @@ _CISC와 RISC 기계어 길이 비교 (x86과 RISC-V)_ 그래서 RISC가 나왔던 배경은 CISC 명령어가 너무 복잡하니 하드웨어를 구현하기가 복잡하고 하드웨어가 복잡하다는 것은 곧 전력 소모가 늘어난다는 것이라 이런 단점을 보완하기 위함이라고 할 수 있습니다. 이것 말고도 RISC가 등장한 배경은 다양할 수 있지만 핵심은 **명령어 구조를 간소화 하자**가 목적이라고 할 수 있습니다. 그렇지만 명령어 구조가 간소화되면서 CISC에서는 명령어 한두개로 할 수 있던 **복잡한 작업을 더 많은 명령어로** 수행해야 하는 단점이 생기기도 합니다. 공학이란 게 언제나 그렇지만 **얻는 게 있으면 잃는 게 있는 법 (trade-off)** 입니다. 이는 위의 비교 그림으로도 쉽게 알 수 있습니다. -하지만 흔히들 얘기하는 CISC와 RISC의 장단점도 현재에 와서는 **상당 부분 무의미**해졌는데, 단적으로 x64 계열 CPU들은 실제 구현 단에서 RISC처럼 동작하기도 하고, ARM 계열 CPU들도 복잡한 연산을 처리하기 위해 명령어가 점점 복잡해지고 있기 때문입니다. 따라서 이런 용어가 있다는 것만 알아두시고, 각 ISA 별 특징을 보는 게 맞지 이 분류에는 너무 집착하지 않는 것을 권장합니다.[^2] +하지만 흔히들 얘기하는 CISC와 RISC의 장단점도 현재에 와서는 **상당 부분 무의미**해졌는데, 단적으로 x64 계열 CPU들은 실제 구현 단에서 RISC처럼 동작하기도 하고, ARM 계열 CPU들도 복잡한 연산을 처리하기 위해 명령어가 점점 복잡해지고 있기 때문입니다. 따라서 이런 용어가 있다는 것만 알아두시고, 각 ISA 별 특징을 보는 게 맞지 이 분류에는 너무 집착하지 않는 것을 권장합니다.[^3] ## 2. 마이크로아키텍처 @@ -68,7 +68,7 @@ _CISC와 RISC 기계어 길이 비교 (x86과 RISC-V)_ 그래서 이 ISA를 실제로 구현하기 위해선 어떤 하드웨어들을 어떻게 조합할지를 고려해야 합니다. 이런 구현상의 문제를 고려하여 ISA를 실제 하드웨어로 구현한 아키텍처를 **마이크로아키텍처 (Microarchitecture)** 라고 부릅니다. 굳이 비유하면 ISA는 건물의 설계도랑 비슷하고, 마이크로아키텍처는 실제 건설된 건물이랑 비슷하다고 보시면 됩니다. -따라서 같은 ISA 안에서도 수많은 마이크로아키텍처가 존재합니다. 또한 CPU를 이루는 하드웨어라면 결국 **반도체**로 만들어지기 때문에 **반도체 공정**이 발전하면 마이크로아키텍처도 발전하고 그에 따라 CPU 성능도 올라가게 됩니다. 즉 최신 CPU는 구형 CPU와 (거의) 같은 명령어를 훨씬 빠른 속도로 실행할 수 있는 것입니다. [^3] +따라서 같은 ISA 안에서도 수많은 마이크로아키텍처가 존재합니다. 또한 CPU를 이루는 하드웨어라면 결국 **반도체**로 만들어지기 때문에 **반도체 공정**이 발전하면 마이크로아키텍처도 발전하고 그에 따라 CPU 성능도 올라가게 됩니다. 즉 최신 CPU는 구형 CPU와 (거의) 같은 명령어를 훨씬 빠른 속도로 실행할 수 있는 것입니다. [^4] ![](same-isa-different-microarchitecture.png){: w="500"} _같은 ISA를 구현한 서로 다른 마이크로아키텍처_ @@ -82,7 +82,7 @@ _같은 ISA를 구현한 서로 다른 마이크로아키텍처_ ![](cpu-core.png){: w="500"} _[AMD ZEN3](https://en.wikipedia.org/wiki/Zen_3) CPU 내부에서 코어의 모습 (빨간색 상자). 이런 그림을 **Die shot**이라 부릅니다_ -그러면 코어가 하는 일은 무엇일까요? 의외로 코어가 하는 일은 대부분 이전 포스트에서 설명이 되었습니다. 바로 코어는 **CPU 명령어 사이클**을 직접 실행하는 주체입니다. 그래서 여기서는 이 명령어 사이클 각각을 코어의 어떤 부분이 담당하는지 간단하게나마 뜯어보고자 합니다. [^4] (refresh를 위해 그림도 다시 가져오겠습니다) +그러면 코어가 하는 일은 무엇일까요? 의외로 코어가 하는 일은 대부분 이전 포스트에서 설명이 되었습니다. 바로 코어는 **CPU 명령어 사이클**을 직접 실행하는 주체입니다. 그래서 여기서는 이 명령어 사이클 각각을 코어의 어떤 부분이 담당하는지 간단하게나마 뜯어보고자 합니다. [^5] (refresh를 위해 그림도 다시 가져오겠습니다) ![](../../2023-08-20/computer-hardware-2-cpu-1/instruction-cycle.png){: w="400"} _다시 돌아온 명령어 사이클_ @@ -93,7 +93,7 @@ _다시 돌아온 명령어 사이클_ CPU 코어에서 말하는 프론트엔드와 백엔드 또한 이런 느낌에서 크게 다르지는 않습니다. 다만 여기는 상호작용의 경계면이 **CPU 내외부**일 뿐입니다. CPU 코어의 프론트엔드는 외부에서 명령어를 처리하도록 명령을 받으면 명령어를 **불러와서 (Fetch) 해석 (Decode)**하는 역할을 수행합니다. -명령어를 불러오는 명령어가 메모리에 저장되어 있으니 거기서 불러와야 할 것입니다[^5]. 이 부분은 언코어 파트의 내용도 필요하기 때문에 일단은 이 정도로만 요약하겠습니다. 이후 불러온 명령어를 **해석 (Decode)**하는 작업을 수행해야 합니다. +명령어를 불러오는 명령어가 메모리에 저장되어 있으니 거기서 불러와야 할 것입니다[^6]. 이 부분은 언코어 파트의 내용도 필요하기 때문에 일단은 이 정도로만 요약하겠습니다. 이후 불러온 명령어를 **해석 (Decode)**하는 작업을 수행해야 합니다. 그런데 명령어를 해석한다는 것이 무슨 의미일까요? 이제는 하도 우려서 사골이 되지 않았을까 하는(...) x86 아키텍처의 `add` 명령어 예시를 다시 확인해보겠습니다. 편의상 이미지 전체가 아닌 `add` 명령어 부분만 가져오겠습니다. @@ -101,7 +101,7 @@ CPU 코어에서 말하는 프론트엔드와 백엔드 또한 이런 느낌에 1141: 01 d0 add %edx,%eax ``` -메모리 주소 말고 그 뒤에 16진수 부분이 실제 메모리에 저장되는 명령어 형태입니다. 2바이트이므로 비트로 풀어보면 `0000_0001_1101_0000`이 저장되어 있는 것입니다[^6] CPU가 메모리로부터 명령어를 받은 상태가 딱 이 상태인데, 그냥 봐서는 이게 `add` 명령어인지 어떻게 알 수 있을까요? +메모리 주소 말고 그 뒤에 16진수 부분이 실제 메모리에 저장되는 명령어 형태입니다. 2바이트이므로 비트로 풀어보면 `0000_0001_1101_0000`이 저장되어 있는 것입니다[^7] CPU가 메모리로부터 명령어를 받은 상태가 딱 이 상태인데, 그냥 봐서는 이게 `add` 명령어인지 어떻게 알 수 있을까요? ISA 파트에서 명령어는 **ISA가 사전 정의한 포맷**에 의해서 종류가 결정된다고 하였습니다. 그러면 x86 ISA는 `add` 명령어를 어떻게 정의했는지 확인할 필요가 있겠습니다. @@ -112,7 +112,7 @@ _x64 ISA의 명령어 포맷 ([인텔 공식 문서](https://www.intel.com/conte 포맷이 꽤 복잡합니다. 앞서 x86 ISA는 명령어마다 길이가 다 다르다고 했는데, 그렇기 때문에 모든 명령어가 이 포맷에 있는 모든 영역을 사용하지 않습니다. 결론부터 얘기하면 우리가 살펴볼 `add` 명령어는 1바이트의 `Opcode`와 `ModR/M` 영역만 사용합니다. 따라서 앞선 `01` 파트가 `Opcode` 파트이고 뒤에 `d0`가 `ModR/M` 파트라고 할 수 있습니다. -즉 명령어를 해석한다는 것은 이 포맷에 맞게 명령어를 해석해서 종류가 무엇이었고 어떤 작업을 해야 하는지를 정하는 것을 의미합니다. 이 부분이 코어의 프론트엔드가 수행하는 핵심 역할이며 이를 수행하는 장치를 **디코더 (Decoder)**라고 부릅니다. 이 디코더가 코어 하나에 몇개 있는지가 나름 중요한 스펙인데, 그래서 디코더가 N개 있는 경우 **N-way 디코더**라고 흔히 표현합니다. 이 N개의 디코더는 모두 **병렬적**으로 작동할 수 있어서 동시에 최대한 많이 작동하는 게 성능에 유리하게 됩니다. 아래는 2023년 인텔의 최신 CPU인 랩터 레이크 (Raptor Lake)에 쓰인 골든 코브 마이크로아키텍처의 예시인데 6-way 디코더를 사용했음을 알 수 있습니다[^7]. +즉 명령어를 해석한다는 것은 이 포맷에 맞게 명령어를 해석해서 종류가 무엇이었고 어떤 작업을 해야 하는지를 정하는 것을 의미합니다. 이 부분이 코어의 프론트엔드가 수행하는 핵심 역할이며 이를 수행하는 장치를 **디코더 (Decoder)**라고 부릅니다. 이 디코더가 코어 하나에 몇개 있는지가 나름 중요한 스펙인데, 그래서 디코더가 N개 있는 경우 **N-way 디코더**라고 흔히 표현합니다. 이 N개의 디코더는 모두 **병렬적**으로 작동할 수 있어서 동시에 최대한 많이 작동하는 게 성능에 유리하게 됩니다. 아래는 2023년 인텔의 최신 CPU인 랩터 레이크 (Raptor Lake)에 쓰인 골든 코브 마이크로아키텍처의 예시인데 6-way 디코더를 사용했음을 알 수 있습니다[^8]. ![](golden-cove-frontend.png){: w="600"} _골든 코드 마이크로아키텍처의 프론트엔드 ([출처](https://www.anandtech.com/show/16881/a-deep-dive-into-intels-alder-lake-microarchitectures/3))_ @@ -132,7 +132,7 @@ CPU가 수행하는 연산의 종류는 CPU 포스트 시작 부분에서 사칙 ![](golden-cove-integer-unit.jpg){: w="600"} _골든 코드 마이크로아키텍처의 정수 연산 유닛. 설명에 나온 것 이외에도 다양한 장치가 있음을 알 수 있습니다. ([출처](https://www.anandtech.com/show/16881/a-deep-dive-into-intels-alder-lake-microarchitectures/3))_ -물론 정수가 아닌 소수점 연산도 컴퓨팅에 필수불가결한 요소이므로 이를 위한 연산 장치도 존재합니다. 컴퓨터는 소수점을 **부동 소수점 (Floating Point)**[^8] 방식으로 구현합니다. 그래서 보통 소수점 연산 장치를 **부동 소수점 장치 (Floating Point Unit, FPU)** 라고 부릅니다. +물론 정수가 아닌 소수점 연산도 컴퓨팅에 필수불가결한 요소이므로 이를 위한 연산 장치도 존재합니다. 컴퓨터는 소수점을 **부동 소수점 (Floating Point)**[^9] 방식으로 구현합니다. 그래서 보통 소수점 연산 장치를 **부동 소수점 장치 (Floating Point Unit, FPU)** 라고 부릅니다. 백엔드의 연산 장치 또한 프론트엔드처럼 N개가 존재하여 이 N개가 동시에 작동할 수 있습니다. 다만 보통은 INT 장치와 FPU를 합쳐서 하나의 단위로 보게 됩니다. 즉 한 단위에 FPU가 작동 중이면 INT 장치는 작동할 수 없는 제약이 있습니다. 또한 메모리 관련 장치는 굉장히 많이 사용되기 때문에 INT 장치와 별개의 장치로 할당되는 경우가 일반적입니다. @@ -160,14 +160,14 @@ _최신 AMD CPU들의 클럭 속도. 인텔도 엇비슷한 수준입니다_ 전통적으로 CPU에는 코어가 하나만 있었습니다. CPU 제조사들은 2000년대 초까지는 하나의 코어가 작동하는 속도 (클럭, Clock)를 계속해서 끌어올리는 방식으로 CPU 성능을 올리고자 하였습니다. 하지만 이내 곧 일정 수준 이상으로 클럭을 올리는 것은 물리적으로 어렵다는 것을 깨닫고 CPU 성능 향상을 위해 CPU 하나에 **코어를 여러개** 두는 방식을 고려하게 됩니다. 이렇게 하여 단일 CPU에 여러 코어가 있는 **멀티 코어 프로세서 (Multi Core Processor)**가 등장하게 됩니다. -멀티 코어 프로세서가 왜 CPU 성능에 도움이 되는지를 정리하면, 먼저 코어 하나가 하는 역할이 바로 명령어 사이클을 수행하는 것이라고 말씀드렸습니다. 즉 코어 하나는 쉽게 프로그램 하나를 실행하는 것이라 보시면 됩니다. 여기서 코어가 여러개 존재하게 되면 **동시에 병렬적으로** 서로 다른 프로그램을 실행할 수 있게 됩니다. 이론적으로는 코어가 두개라면 서로 다른 두개의 프로그램을 기존 단일 코어만 있을 때보다 두배 더 빨리 실행할 수 있는 것입니다[^9]. +멀티 코어 프로세서가 왜 CPU 성능에 도움이 되는지를 정리하면, 먼저 코어 하나가 하는 역할이 바로 명령어 사이클을 수행하는 것이라고 말씀드렸습니다. 즉 코어 하나는 쉽게 프로그램 하나를 실행하는 것이라 보시면 됩니다. 여기서 코어가 여러개 존재하게 되면 **동시에 병렬적으로** 서로 다른 프로그램을 실행할 수 있게 됩니다. 이론적으로는 코어가 두개라면 서로 다른 두개의 프로그램을 기존 단일 코어만 있을 때보다 두배 더 빨리 실행할 수 있는 것입니다[^10]. ![](sandy-bridge-die-shot.jpg){: w="500"} _코어가 4개 있는 CPU의 die shot 예시_ 멀티 코어 프로세서가 PC에 본격적으로 데뷔한 것은 2005년입니다. 거의 동시기에 인텔과 AMD가 코어가 두개 있는 **듀얼 코어 (Dual Core)** CPU를 처음 발표하면서 본격적으로 멀티 코어의 시대를 열게 되었습니다. 하지만 멀티 코어를 제대로 사용하기 위해선 운영체제도 그에 맞는 설계가 필요하고, 프로그램들도 멀티 코어를 지원하게 개발이 되어야 하고, 무엇보다 당시에는 개인용 컴퓨터에 멀티 코어가 체감이 될 만한 상황이 많이 없었습니다. 그래서 2010년대 이전까지 최고급 라인업 정도만 쿼드 코어 (Quad Core, 코어 4개)였고 일반적으로 많이 접근하는 라인업은 듀얼 코어에서 계속 머물렀습니다. -그런데 2010년대에 접어들면서 AMD가 끝도 없는 부진을 거듭하자 인텔은 최고 소비자용 라인업을 계속 쿼드 코어로 동결시키며 한동안 코어 수 발전에 정체기가 찾아오게 됩니다. 인텔이 처음 쿼드 코어 CPU를 발표한 것이 2007년인데 무려 2017년까지 장장 10년 동안 소비자 제품군에서 접할 수 있는 코어 수는 최대 4개였던 것입니다. 하지만 AMD가 2017년에 개인용 CPU에서도 처음으로 최대 8코어 CPU를 발표하면서 코어 수 발전에 한 획을 긋게 되고 이후 2019년에는 16코어까지 늘리면서 코어 수 경쟁에 불을 붙이게 되었습니다. 그래서 2023년 기준으로는 인텔도 충분히 많은 코어수를 제공하며 경쟁을 하고 있습니다[^10]. +그런데 2010년대에 접어들면서 AMD가 끝도 없는 부진을 거듭하자 인텔은 최고 소비자용 라인업을 계속 쿼드 코어로 동결시키며 한동안 코어 수 발전에 정체기가 찾아오게 됩니다. 인텔이 처음 쿼드 코어 CPU를 발표한 것이 2007년인데 무려 2017년까지 장장 10년 동안 소비자 제품군에서 접할 수 있는 코어 수는 최대 4개였던 것입니다. 하지만 AMD가 2017년에 개인용 CPU에서도 처음으로 최대 8코어 CPU를 발표하면서 코어 수 발전에 한 획을 긋게 되고 이후 2019년에는 16코어까지 늘리면서 코어 수 경쟁에 불을 붙이게 되었습니다. 그래서 2023년 기준으로는 인텔도 충분히 많은 코어수를 제공하며 경쟁을 하고 있습니다[^11]. ![](high-end-core-count.png){: w="700"} _2023년 최신 인텔과 AMD CPU의 코어 수 (하이엔드 모델 기준)_ @@ -192,13 +192,14 @@ _2023년 최신 인텔과 AMD CPU의 코어 수 (하이엔드 모델 기준)_ --- -[^1]: 각각 씨스크, 리스크로 발음합니다. -[^2]: -[^3]: "거의" 같다고 표현한 이유는 최신 마이크로아키텍처는 일부 특수 명령어가 추가되기도 하기 때문입니다. 이 특수 명령어는 ISA의 기본 동작에는 영향을 미치지 않는 **확장판** 같은 것이라 보시면 됩니다. -[^4]: 간단하다고 해도 딱히 짧지는 않을 예정이나, 진짜 각잡고 뜯어보면 전공 서적 분량도 나올 수 있습니다... -[^5]: 아직 다루지 않았지만 정확히는 메모리 데이터의 일부를 저장하는 장치인 **캐시 (Cache)** 라는 CPU 내부의 고속 메모리에서 가져옵니다. 자세한 내용은 언코어 파트에서 다룹니다. -[^6]: 언더바는 4비트 단위로 나눠서 보기 편하게 붙인 것입니다. 긴 숫자 표현할 때 천의 단위마다 붙이는 콤마 같은 것이라 보시면 됩니다. -[^7]: 당연히 디코더 개수가 많다고 무조건 좋은 것은 아닙니다. 이유는 후술할 것이고, 원론적으로 공학은 언제나 trade-off 법칙이 작용함을 염두에 두는 게 좋습니다. -[^8]: 부동 소수점은 대부분 [**IEEE-754**](https://en.wikipedia.org/wiki/IEEE_754)라는 표준에 의해 정의됩니다. 관심 있으신 분은 한번 확인해보세요. -[^9]: 이론과 현실은 언제나 다릅니다. 이론상은 그래도 현실적으로는 모든 상황에서 무조건 컴퓨터 속도가 2배 빨라지는 것은 아닙니다. -[^10]: 다만 인텔은 2023년 기준으로는 다소 꼼수(?)로 코어수를 늘리고 있습니다. 주로 모바일 CPU에서 많이 채택하던 고성능 코어와 저성능 코어를 섞는 방식을 도입하여 고성능 코어는 6-8개 정도만 탑재하고 저성능 코어를 최소 4개에서 최대 16개까지 탑재하는 방식을 사용하여 코어수를 늘리고 있습니다. \ No newline at end of file +[^1]: 한가지 재밌는 점은 인텔과 AMD가 사용하는 ISA인 x64 (=AMD64)는 이름에서 알 수 있듯이 AMD가 라이센스를 가지고 있습니다. 그래서 인텔은 AMD로부터 이 ISA의 라이센스를 사서 CPU를 만들고 있습니다. +[^2]: 각각 씨스크, 리스크로 발음합니다. +[^3]: +[^4]: "거의" 같다고 표현한 이유는 최신 마이크로아키텍처는 일부 특수 명령어가 추가되기도 하기 때문입니다. 이 특수 명령어는 ISA의 기본 동작에는 영향을 미치지 않는 **확장판** 같은 것이라 보시면 됩니다. +[^5]: 간단하다고 해도 딱히 짧지는 않을 예정이나, 진짜 각잡고 뜯어보면 전공 서적 분량도 나올 수 있습니다... +[^6]: 아직 다루지 않았지만 정확히는 메모리 데이터의 일부를 저장하는 장치인 **캐시 (Cache)** 라는 CPU 내부의 고속 메모리에서 가져옵니다. 자세한 내용은 언코어 파트에서 다룹니다. +[^7]: 언더바는 4비트 단위로 나눠서 보기 편하게 붙인 것입니다. 긴 숫자 표현할 때 천의 단위마다 붙이는 콤마 같은 것이라 보시면 됩니다. +[^8]: 당연히 디코더 개수가 많다고 무조건 좋은 것은 아닙니다. 이유는 후술할 것이고, 원론적으로 공학은 언제나 trade-off 법칙이 작용함을 염두에 두는 게 좋습니다. +[^9]: 부동 소수점은 대부분 [**IEEE-754**](https://en.wikipedia.org/wiki/IEEE_754)라는 표준에 의해 정의됩니다. 관심 있으신 분은 한번 확인해보세요. +[^10]: 이론과 현실은 언제나 다릅니다. 이론상은 그래도 현실적으로는 모든 상황에서 무조건 컴퓨터 속도가 2배 빨라지는 것은 아닙니다. +[^11]: 다만 인텔은 2023년 기준으로는 다소 꼼수(?)로 코어수를 늘리고 있습니다. 주로 모바일 CPU에서 많이 채택하던 고성능 코어와 저성능 코어를 섞는 방식을 도입하여 고성능 코어는 6-8개 정도만 탑재하고 저성능 코어를 최소 4개에서 최대 16개까지 탑재하는 방식을 사용하여 코어수를 늘리고 있습니다. \ No newline at end of file