본문 바로가기
System/Computer Architecture

프로그래머가 프로세서도 알아야 해요? | 프로그래머가 몰랐던 멀티코어 CPU 이야기, 김민장 저

by wanggoNya 2024. 8. 10.

 

     ※  아래 내용은 스스로 공부한 내용을 정리한 글입니다.
     ※  때로 정확하지 않을 수 있으며, 참고만 부탁드립니다.
     ※  잘못된 내용이 있을시 댓글로 알려주시면 감사하겠습니다.
     ※  해당 글은 『김민장 저, 프로그래머가 몰랐던 멀티코어 CPU 이야기』를 읽고 정리한 글입니다.

 

 

 

요즘 시스템 분야에 흥미를 느껴서 김민장 님 저서인 『프로그래머가 몰랐던 멀티코어 CPU 이야기』를 읽기 시작했습니다. 하루에 한 챕터씩 읽으면서 글과 실물의 괴리감을 줄이기 위해 간단한(?) 사이드 프로젝트도 함께 해볼까 하는데 시간이 가능할지 모르겠네요. 그래도 오래간만에 가슴 뛰는 공부 거리를 찾았습니다. 

 


프로세서

흔히 CPU (중앙처리장치)라는 표현을 자주 쓴다. 그러나 명확하게 말하면 현대 CPU는 하나의 집적회로로 만들어진 마이크로프로세서 (microprocessor)로 표현하는 것이 더 바람직하다. 책에서는 CPU 대신 마이크로 프로세서 혹은 줄여서 프로세서라는 표현을 쓴다.

 

프로세서, 왜 알아야 해요?

1. 파이프라인은 현대 프로세서의 기본 기술이다. 그리고 파이프라인은 대표적인 병렬 프로그래밍 방법론이다. 

2. 프로세서는 명령어 사이의 의존성을 분석해 명령어 처리율을 높일 수 있는데, 의존성 분석은 컴파일러나 소프트웨어 테스팅에서, 병렬 프로그래밍에서도 기본적인 개념이다.

3. 컴퓨터 성능에 결정적인 영향을 미치는 캐시는 웹 브라우저 캐시, 운영체제의 각종 캐시 등으로 웹 서버에서 아주 손쉽게 찾아볼 수 있다. 캐시에 적용되는 여러 정책도 흡사한 면이 많다.

4. 단 프로세서는 하드웨어로 구현되어야 하기에 소프트웨어의 여러 정교한 알고리즘처럼 만들기는 어렵고 비슷한 성능을 낼 수 있게 근사하여 구현한다.

5. 멀티코어 프로세서에서는 캐시 관리가 더 어려워지는데 이 문제는 서버 시스템에서도 고스란히 볼 수 있다.

6. 현재 프로세서에는 분기 예측기라는 컴포넌트가 필수적으로 들어있다. 이 분기 예측기의 알고리즘 역시 캐시처럼 소프트웨어적인 아이디어로 만들어져 있다. 프로그램이 미래에 보일 행동을 과거 사실을 분석해 예측하는 알고리즘은 얼마든지 여러분의 프로그램에 적용될 수 있다.

7. prefetching은 앞으로 쓸 것 같은 데이터를 미리 가져오는 기술로 역시 현대 프로세서의 주요 기술 중 하나이다. 하지만 이 prefetching은 운영체제에서도 쉽게 찾아볼 수 있다.

8. 한편 요즘 프로그램은 각종 보안 취약성으로 위협받고 있다. 그런데 왜 이런 보안 문제가 일어나는지 프로세서를 알면 그 근본 원인을 이해하게 되고 더욱 안전한 프로그램을 만들 수 있다.

 

멀티코어 프로세서의 등장

1. 1971년 인텔이 출시한 세계 최초의 범용 마이크로프로세서 인텔 4004는 2,300개의 트랜지스터로 1초에 약 92,000개의 명령어를 처리할 수 있었다.

2. 그리고 30년이 지나, 2001년에는 1억 개의 트랜지스터로 수억 개의 명령어가 처리될 정도로 엄청난 발전을 했다.

3. 최근 큰 변화가 있었다. 바로 멀티코어 프로세서로의 진화다. 이제 수많은 트랜지스터가 단일 프로세서의 성능을 높이기보다는 멀티코어 프로세서를 만들기 위해 쓰인다. 현재는 클록 속도 10 GHz로 늘리는 것보다 프로세서 코어 개수를 늘리는 것에 열중하고 있다.

 

 병렬성의 중요성

몇 년 전부터 2010년 현재까지 최대 화두는 병렬성에 있다. 프로세서뿐만 아니라 프로그래밍 방법론, 컴파일러, 소프트웨어 공학, 운영체제까지 거의 모든 컴퓨터 분야에서 병렬성을 잘 활용하는 방법을 찾고자 노력하고 있다.

 

GPU (Graphics Processing Unit), 공부할 것이 늘었다

그래픽 분야에서 주로 쓰였던 그래픽 카드의 GPU가 이제 프로세서처럼 일반적인 계산을 하는 강력한 연산 장치로 대두하고 있다. 단순한 그래픽 처리를 위한 보조프로세서로서의 역할이 아니라 특정 연산은 프로세서보다 수십, 수백 배 성능이 빠른 중요한 연산 장치로 최근 주목받고 있다. 데스크톱 쿼드코어(Quad-core) 프로세서가 4개의 아주 똑똑한 코어로 이루어져 있다면, GPU는 단순한 구조지만 수십, 많게는 백여 개가 넘는 작은 코어가 똘똘 뭉쳐 있는 구조다. 

 

하지만 프로그래밍 방법론은 크게 바뀌지 않았다.

예전보다 프로세서는 엄청나게 빨라지고 코어 개수도 여러 개로 늘어났으며 GPU까지 등장했지만, 하드웨어에서 제공하는 이런 풍부한 병렬성을 잘 쓰기 위한 프로그래밍 방법론은 그렇게 혁명적으로 바뀌지 않았다. 멀티스레드 프로그래밍은 과거에도 어려웠고 지금도 어렵다. 점차 개수가 늘어나는 멀티코어 프로세서를 최적으로 사용하기 위해 점점 병렬 프로그래밍에 대한 요구는 커질 것이다. 아니 이미 절실한 과제다. 더 빠르고 좋은 프로그램을 만들려면 최신 병렬 프로세서를 보다 적극적으로 활용해야 한다. 

 

소프트웨어 프로그래머에게

프로세서가 어려운 하드웨어 지식으로만 가득 차 있다는 선입관을 버리자. 프로세서는 실제 구현만 하드웨어에서 이뤄지는 것뿐이지 완벽하게 프로그래밍을 하는 것과 같다. 마치 "수많은 명령을 어떻게 하면 빠르게 처리할 수 있을까?"라는 문제를 프로그래밍하는 것과 완전히 같다. 더 빠른 프로그램을 만들도록 여러 알고리즘을 짜내야 하는 것과 똑같다. 하드웨어인 프로세서는 정말 말랑말랑한 소프트웨어 알고리즘으로 채워져 있다는 것이다.

 

들어가기 전에

챕터 2장부터 8장까지는 일반적인 전산학과에서 배우는 컴퓨터 구조로 시작한다. 그리고 챕터 9장부터 11장까지는 멀티코어 프로세서와 GPU의 내부 작동 알고리즘을 이야기한다. 챕터 12장부터 17장까지는 캐시 같은 고성능 프로세서에 쓰인 여러 알고리즘이 그 뒤를 잇는다. 그리고 챕터 18장부터 20장까지는 자연스럽게 병렬 프로그래밍과 연결되도록 한다. 

 

 


[ Reference ]

프로그래머가 몰랐던 멀티코어 CPU 이야기 (김민장 저) 

"챕터 1장, 프로그래머가 프로세서도 알아야 해요?" 中