[혼자 공부하는] CPU

AIRIMI·2025년 1월 17일
0

혼공컴운

목록 보기
2/4
post-thumbnail

최근 개인적으로 AI 분야를 탐색하는 과정에서 제가 든 생각이, 이미지나 음성 또는 자연어처리 등 여러 분야가 있지만 이들은 모두 어쨌든 백본모델을 고르고 최고의 성능을 찾아가기 위해 최적화를 하는게 공통적이고 최종적인 목적이니까 그럼 일단 최적화나 경량화 이런 측면을 탐구하면 어떨까?🤔 였습니다.

그래서 boostcourse에서 제공하는 무료강의들 중에 '딥러닝 모델 경량화'와 관련된 강의를 보고 있는데 아직 초입부라고 해도 흥미돋 주제이더라구요. 물론 이게 이 프로그램에서 과거에 진행했던 부트캠프(대략 2021,2022년도..?) 강의를 그대로 제공해서 너무 옛스러운 주제일 수도 있고 기술이 갈수록 발전하니까 굳이 스러울 수 있다고 생각할 수도 있으련진 모르겠지만(제 수준에서는 모르겠습니다.. MLOps나 NAS, LLMOps 등 관련있는 내용인거 같긴 한데) 암튼! 제가 하고자한 말은 지금 공부하는 컴퓨터구조랑 운영체제 분야도 이런 최적화에 관련이 있지 않나 싶습니다. 맞져?🫠

맞다고 하네요. ( 😂제 교수님은 GPT이십니다...)

암튼, 앞으로 계속해서 열심히 공부하겠습니다!


⚠ 아래 내용은 책 개념 + 제 머릿속 지식이 다수 포함되어있습니다. ⚠
( 📢 수정할 내용이 있다면 알려주세요! )

🖥 Ch.04 CPU와 작동 원리

ALU 와 제어장치

ALU는 제어신호와 피연산자들을 받고 결과를 계산하는데 이 과정에서 레지스터와 제어장치가 필요합니다. 제어장치에서는 어떤 연산을 처리할 지 알려주는 제어신호를 보내고 레지스터에는 피연산자가 저장되어 있습니다.

이때 레지스터가 이용되는 이유는 메모리 접근 속도가 빠르기 때문입니다. 만약 레지스터가 아닌 일반 CPU를 통해 수행한다면 속도가 훨씬 느려지기에 프로그램의 실행 속도에도 영향을 줄 수 있습니다!

추가적으로 ALU는 계산 결과 외에 더불어 flag를 내보내는데 이는 결과에 대한 추가적 상태 정보를 의미합니다. 저는 플래그를 시스템프로그래밍에서 명령어의 추가적 인자들 관련해서 접했던걸로 기억하는데 컴퓨터구조 쪽에서도 플래그가 있었다니... 🫥

이 플래그들은 각각 다음의 플래그 레지스터들에 저장됩니다.

  • 부호플래그 (연산 결과의 부호 구분)
  • 제로 플래그 (연산 결과가 0인 지의 여부)
  • 캐리 플래그 (올림수나 빌림수 발생 여부)
  • 오버플로우 플래그 (오버플로우의 발생 여부)
  • 인터럽트 플래그 (인터럽트 가능의 여부)
  • 슈퍼바이저 플래그 (모드의 구분)![]

제어장치와 관련해 Clock이라는 중요한 개념이 등장합니다! 이는 시간의 단위이며 클럭의 주기에 맞춰 여러 작동이 수행이 됩니다.


위 사진의 예로 Clock cycle이 나오는데 이렇게 CC 마디마다 ALU나 Reg(Register) 와 같은 부품들이 딱딱 수행됩니다. 즉, 프로그램의 명령 순서에 따라 각 CC에 맞춰서 실행되는 모습을 볼 수 있습니다!

레지스터의 종류

  • 프로그램 카운터 (PC) : 명령어의 주소 저장, 이후 PC가 증가하며 다음 명령어를 읽음
  • 명령어 Reg : 명령어를 저장
  • 메모리 주소 Reg : 메모리의 주소를 저장
  • 메모리 버퍼 Reg : 메모리와 주고받을 값 저장
  • 플래그 Reg : 플래그를 저장
  • 범용 Reg : 다양한 상황에서 자유롭게 저장 가능
  • 스택 포인터 : 스택의 최상단을 가리키는 Reg
  • 베이스 Reg : 기준 주소를 저장

이렇게 알아야할 레지스터는 총 8개라고 하네요.


이때 스택 포인터가 있는 이유는 명령어 중에서 메모리에 잠깐 올려 두었다가 종료 전에 다시 해제하는 경우에 스택영역을 사용하는데 이때 마지막으로 저장한 값의 위치를 저장할 수 있도록 한 것입니다!

명령어 사이클과 인터럽트

명령어 사이클은 명령어를 처리하는 그 흐름이라 할 수 있고 인터럽트는 이 흐름이 끊어지는 경우를 말합니다!

  • 인출 사이클
  • 실행 사이클
  • 간접 사이클

인터럽트는 여러 원인에 의해 발생할 수 있는데 공통된 기준은 없지만 동기/ 비동기 인터럽트로 나눌 수 있다고 합니다.

  • 예외(동기 인터럽트): CPU에 의해 발생
  • 하드웨어 인터럽트 (비동기 인터럽트) : IOSystem에 의해 발생 >> 인터럽트 요청신호와 인터럽트 플래그 등 여러 요소가 고려되며 인터럽트 처리시 인터럽트 핸들러가 작동!

제가 컴파일러나 시스템프로그래밍 수업을 들으면서 이 예외처리 관련해서 여러 내용을 접할 수 있었는데 되게 흥미롭고 복잡하지만 재밌었습니다! 추가적인 '예외처리' 공부를 해보시는걸 추천드려요.


⏲ Ch.05 CPU 성능 향상 기법

  • 클럭 : 클럭 속도(1초에 몇 클럭 반복)가 빨라지면 명령어 사이클이 더 빠르게 진행될 수 있음 > 클럭속도(Hz)는 CPU 속도 단위로 간주되기도 한다. but 클록속도가 너무 높아도 발열문제가 생기고 CPU 성능을 올리는데 한계 존재!
  • 멀티코어 : 코어는 '명령어를 실행하는데 필요한 부품들을 포함하는 형태'로 볼 수 있고 8코어와 같이 여러 코어들을 포함하는 CPU를 멀티코어 CPU / 멀티코어 프로세서 라고 함! but, 코어가 많을수록 무조건 처리속도가 빨라지지는 않는다.
  • 멀티스레드 : thread는 실행 흐름의 단위. 멀티스레드는 하나의 코어로 여러 명령어들을 동시에 처리하는 CPU를 말함!

빠른 CPU를 위한 설계 비법

위 개념들을 참고해본다면 빠른 CPU를 위해서는 클럭 속도가 빠르면서 멀티코어를 적용하되 명령어들을 코어에 어떻게 분배시킬 지를 잘 정해야 하고, 스레드 또한 하드웨어 스레드와 소프트웨어 스레드를 잘 적용해 멀티스레드 프로세서를 설계하면 CPU가 빠른 성능을 보여줄 것 같습니다!

실제로 이를 구체적으로 어떻게 설계하고 구현하는 지 궁금해지네요... 아시는분? 🙄

명령어 병렬 처리 기법

추가적으로 CPU가 시간을 알뜰하게 사용해 작동하도록 설계하는 것 또한 중요하다고 합니다.


위 사진을 자주 봤었는데 만약 저렇게 명령어들을 '파이프라이닝'으로 처리 안 하고 다음과 같이 처리하면 다음 명령어를 처리하기까지 몇 CC를 낭비하게 되는지 알 수 있습니다.

+이런 파이프라인을 설계시 발생가능한 위험(Hazard)가 존재합니다.
크게 Data Hazard, Control Hazard, Structural Hazard로 나뉩니다.

  • Data Hazard : 데이터 의존성에 의해 발생
  • Control Hazard : PC의 급변에 의해 발생
  • Structural Hazard (resource Hazard): ALU나 Reg같이 이미 사용중인 부품들에 접근하지 못하는 경우 발생

위 Hazard 개념과 관련해서 여러 추가적인 개념이나 설명이 필요할 수 있는데 전공책 강추드리고 아니면 위키피디아에도 개념설명 잘 나와있으니 봐보세욤!

책 : Computer Organization and Design Risc-V Edition: The Hardware Software Interface

https://en.wikipedia.org/wiki/Hazard_(computer_architecture)

슈퍼스칼라 : CPU 내부에 여러 명령어 파이프라인을 포함한 구조 > 매 클럭 주기마다 동시에 명령어를 인출, 실행 가능! 따라서 이론적으로는 파이프라인 개수에 빌계해 속도가 빨라져야 하지만 Hazard 발생 등 문제로 인해 반드시 비례해 빨라지지는 않는다고 한다..

비순차적 명령어 처리 : Data Hazard 등과 같은 위험들에 따라 데이터 의존성이나 여러 위험들을 고려해서 좀더 속도를 빠르게 하는데 명령어 처리 순서를 바꿔도 결과에는 영향을 미치지 않는 그런 명령어를 먼저 실행해 파이프라인이 멈추는 것을 방지하는 기법.

🤯 저는 이 책에서 슈퍼스칼라와 비순차적 명령어 처리에 대한 개념을 처음 접해본거 같아요. 개인적으로 이 슈퍼스칼라에 대해 더 자세히 공부해보고 싶어지네요!

CISC & RISC

ISA : CPU가 이해할 수 있는 명령어 집합 > 서로 다른 ISA를 차용하고 있는 기기들은 서로 다른 명령어로 쓰인 실행파일을 이해할 수 없음! (ISA는 CPU의 언어라고 볼 수 있음)

CISC : Complex Instruction Set Computer 약자. 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식으로 명령어들의 크기가 일정하지 못해 파이프라이닝에는 부적절하다고 생각.

RISC : Reduced Istruction Set Computer의 약자. 명령어 종류가 CISC에 비해 줄었으며 규격화된 명령어로 이루어짐. > 파이프라이닝에 최적화됨.


p. 125의 확인 문제 2번, p. 155의 확인 문제 4번 풀고 인증하기 Ch.05(05-1) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기

P.125 확인문제2

Q: 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.

  • (플래그 레지스터) : 연산 결과 혹은 CPU 상태에 대한 부가 정보를 저장하는 레지스터
  • (프로그램 카운터) : 메모리에서 가져올 명령어의 주소를 저장하는 레지스터
  • (범용 레지스터) : 데이터와 주소를 모두 저장할 수 있는 레지스터
  • (명령어 레지스터) : 해석할 명령어를 저장하는 레지스터

P.155 확인문제4

Q: 멀티코어 CPU를 도식화한 그림에 용어 써넣기

A: 코어


ps. 방학 너무 빠르게 지나가네요... 요즘 양자컴 얘기가 많던데 양자컴퓨팅 관련해서 공부해볼까 해요 ㅎㅅㅎz

따라서! 방학동안에 목표는 프로젝트, 양자컴퓨팅 및 컴퓨터비전 공부하고 혼공족도 하구 여러 분야 찍먹하기! 😪

0개의 댓글

관련 채용 정보