https://hashmm.com/post/why-m1-so-fast/
https://news.hada.io/topic?id=3315
M1은 1개의 CPU라기 보단, 어떤 실리콘 팩에 여러개 칩을 넣은 어떤 시스템을 뜻한다고 보는게 맞다.
즉, M1안에 CPU가 있는 것이다.
이런 CPU, GPU, Memory 등을 한번에 넣고 있는 시스템을 System on a Chip즉 SoC라고 부른다.
이 SoC안에 UMA (Unified Memory Architecture)라는 것이 있는데, 이것은 CPU, GPU 등의 코어들이 빠르게 정보를 교환하도로 해준다.
UMA를 사용함으로써 기존의 CPU, GPU가 서로 다른 메모리 영역을 차지함으로써 있었던 성능 저하를 막을 수 있었다.
이런 UMA를 AMD나 인텔도 인지하고 있지만, 서로의 비즈니스적인 한계가 있다.
AMD과 인텔은 PC마더보드에 꽂는 범용 CPU인데, SoC로 만들게 되면 제품이 아예 달라진다.
하지만 애플은 자기가 만든걸 자사 제품에 적용하는 꼴이기 때문에 이 아이디어를 즉시 실행가능 했다.
또한, CPU 자체 성능도 향상되었다.
CPU를 만들때 기존에는 클럭 주파수를 늘리면되었다.
근데, 최근에 들어서 더이상 클럭 주파수를 늘릴 수 없게 되었다. (무어 법칙의 끝)
이제는 빠르게 명령을 실행하는것은 어느정도 한계에 봉착했고, 더욱 빠르게 하려면 병렬적으로 실행하게 해야한다.
병렬적으로쓰려면 더욱 많은 CPU 코어를 사용해야한다는것이 일반적인 관점이었다.
하지만, 노트북같은 휴대용 기기에서의 수많은 코어를 탑재는 오히려 낭비라고 판단하여, 애플은 오히려 코어를 최대한 줄이는데 노력했다.
코어를 줄이면서 어떻게 병렬처리를 빠르게 할 수 있었냐 보니까,
비순차 실행 (Out-of-Order Execution OoO)라는 개념을 적극활용했다.
CPU는 실행할때 여러 덩어리의 명령어들을 한번에 실행하게 되는데, 이 명령어들은 순차적으로 실행하게 구성되어있다.
그리고, 특정 메모리 위치에서 데이터를 가져오는 비용은 1byte를 가져오거나 128byte를 가져오는거나 차이가 없다.
그래서 명령어들의 관계의 의존성을 분석해서 의존성이 높은 명령어들을 병렬적으로 처리하는 개념이 나왔는데 이게 바로 OoO이다.
이렇게 실행한 명령어들의 병렬처리가 M1을 적은 코어로도 높은 성능을 낼 수 있게 해준 원동력이다.
그럼 이걸 AMD나 인텔이 적용하면 될 터인데 왜 M1의 속도를 따라잡지 못할까?
CPU는 ISA라는 명령어 세트를 사용한다. 우리가 흔히 아는 x86이나 ARM 등을 말하는 것이다.
이때 디코더라는 것이 필요하다. 일단 애플은 8개의 디코더가 있고, 인텔/AMD는 4개의 디코더가 있다.
또한 명령어를 담을 수 있는 버퍼(ROB)가 3배 정도 더 커서 3배 많은 명령어들을 담을 수 있다.
이렇기 때문에 많은 명령어의 의존관계를 더 많이 파악하여 더 효율적인 병렬처리가 가능하다.
그럼왜 인텔, AMD는 더 많은 디코더와 ROB를 확보하지 않았을까?
인텔과 AMD는 x86을 쓰는듯한데, x86은 명령어가 1~15byte로 가변성이 있어서, 다음 명령어가 언제 시작하는지에 대한 분석이 필요하다.
하지만 애플은 RICS를 사용함. RICS는 명령어길이가 고정이라서 다음 명령어가 언제 시작하는지 쉽게 알 수 있다.
그래서 일정 사이즈마다 잘라서 다른 8개의 디코더에게 던지기만 하면된다.
인텔, AMD는 다음 명령어를 분석해서 디코더에 넣어줘야해서 디코더 추가가 어렵다고 한다.
(x86도 일부분 RISC를 쓴다고 하는것 같은데 완전히는 아닌듯하다.)
'개발 > 자기계발' 카테고리의 다른 글
적게 일하고 잘 사는 기술 (0) | 2021.09.03 |
---|---|
코딩을 잘하는 사람들의 특징 (0) | 2021.08.26 |
로이드의 명언 (0) | 2021.08.19 |
'왜'라는 질문을 하기전에 생각해야 할일 (리처드 파인만) (0) | 2021.07.26 |
헌신없는 지속적인 성공은 없다. (0) | 2021.07.24 |