Basic Computer System - 연산 장치
Basic Computer System
※ 본 포스팅의 내용은 고성능 파이썬 (High Performance Python)
책을 읽고 공부한 내용을 기록한 포스트입니다.
- 컴퓨터를 구성하는 3 요소
- 연산 장치 (CPU) => 초당 얼마나 많이 계산 가능한지
- 메모리 장치 (RAM, Hard-Drive) => 데이터를 얼마나 많이 저장할 수 있으며, 얼마나 빠르게 읽고 쓸 수 있는지
- 연결 장치 (BUS) => 장치 간에 데이터를 얼마나 빠르게 옮길 수 있는지
연산 장치
컴퓨터의 가장 핵심적인 장치로 입력되 bit를 다른 bit로 변환하거나 프로세스 상태를 변경하는 기능을 제공한다. 일반적인 연산 장치는 CPU지만 최근에는 인공지능 모델 학습에 잘 쓰이는 GPU가 인기를 끌고 있다. 연산 장치 성능의 핵심은 한 사이클에 처리할 수 있는 연산의 개수와 1초에 처리할 수 있는 사이클의 횟수이다. 한 사이클에 처리할 수 있는 연산의 개수는 **IPC(Instructions Per Cycle)**로 측정하고, 초당 사이클 횟수는 클럭 속도로 측정한다.
이 두 개념은 CPU의 주 성능 지표이다. 어떤 CPU는 IPC 값이 높지만 클럭 속도가 느리고, 어떤 CPU는 반대인 경우도 있으며, GPU는 클럭 속도가 빠르고 IPC 값도 크지만 다른 문제에서 병목 현상이 발생한다.
클럭 속도를 높이면 초당 연산량이 증가하므로 모든 프로그램의 속도가 개선되며, IPC 값이 높아지면 벡터화 수준이 증가하므로 처리 성능이 올라간다. 벡터화는 CPU가 여러 데이터를 입력받아 한 번에 처리할 때 발생하는데, 이런 명령을 **SIMD(Single Instruction Multiple Data)**라고 한다.
연산 장치 관련 기술
- Hyperthreading
- OS에 가상의 두 번째 CPU를 인식시키고 단일 CPU의 실행 유닛에 두 스레드를 번갈아 가며 실행하도록 하는 기법
- 단일 스레드 대비 30%까지 성능을 끌어올릴 수 있음
- 두 스레드가 서로 다른 실행 유닛을 사용할 때 (Ex-한 스레드는 실수 연산, 다른 스레드는 정수 연산을 할 때) 잘 작동
- 비순차적 명령어 처리 (Out-of-order Execution) - Pipeline
- 이전 작업의 결과에 영향을 받지 않는 부분을 찾아내서 두 작업을 순서와 관계없이 실행하거나 동시에 실행하는 기법
- 순서에 관계가 있는 경우 기다렸다가 처리하는 등의 로직이 섞여 있음
- 사용 가능한 자원을 최대한 활용함으로써 처리 속도를 상승시킴
- 멀티 코어 아키텍처
- 실행 유닛 하나에 CPU를 여러 개 사용하는 기법
- 암달의 법칙(Amdahl’s Law): 멀티 코어에서 작동하도록 설계된 프로그램이더라도 하나의 코어에서 실행해야 되는 부분이 존재하므로, 이 루틴이 코어를 더 투입하더라도 성능이 더 좋아지지 않는 병목으로 작용한다는 법칙이다.
- 파이썬에서는 GIL(Global Interpreter Lock) 때문에 코어를 여러 개 활용하기 쉽지 않음. GIL은 한 번에 명령 하나만 실행하도록 강제하는 파이썬 고유의 인터프리터 법칙으로 다수의 코어를 사용하더라도 한 번에 명령 하나만 처리하기 때문에 멀티 코어를 사용하는 장점이 사라진다.
- 멀티 코어를 사용하기 위해서는 파이썬 내장 라이브러리인 multiprocessing 혹은 ray, numpy or numexpr, cython 등을 사용할 수 있음
Subscribe to SOOFTWARE
Get the latest posts delivered right to your inbox