최근 개인적으로 AI 분야를 탐색하는 과정에서 제가 든 생각이, 이미지나 음성 또는 자연어처리 등 여러 분야가 있지만 이들은 모두 어쨌든 백본모델을 고르고 최고의 성능을 찾아가기 위해 최적화를 하는게 공통적이고 최종적인 목적이니까 그럼 일단 최적화나 경량화 이런 측면을 탐구하면 어떨까?🤔 였습니다.
그래서 boostcourse에서 제공하는 무료강의들 중에 '딥러닝 모델 경량화'와 관련된 강의를 보고 있는데 아직 초입부라고 해도 흥미돋 주제이더라구요. 물론 이게 이 프로그램에서 과거에 진행했던 부트캠프(대략 2021,2022년도..?) 강의를 그대로 제공해서 너무 옛스러운 주제일 수도 있고 기술이 갈수록 발전하니까 굳이 스러울 수 있다고 생각할 수도 있으련진 모르겠지만(제 수준에서는 모르겠습니다.. MLOps나 NAS, LLMOps 등 관련있는 내용인거 같긴 한데) 암튼! 제가 하고자한 말은 지금 공부하는 컴퓨터구조랑 운영체제 분야도 이런 최적화에 관련이 있지 않나 싶습니다. 맞져?🫠
맞다고 하네요. ( 😂제 교수님은 GPT이십니다...)
암튼, 앞으로 계속해서 열심히 공부하겠습니다!
⚠ 아래 내용은 책 개념 + 제 머릿속 지식이 다수 포함되어있습니다. ⚠
( 📢 수정할 내용이 있다면 알려주세요! )
ALU는 제어신호와 피연산자들을 받고 결과를 계산하는데 이 과정에서 레지스터와 제어장치가 필요합니다. 제어장치에서는 어떤 연산을 처리할 지 알려주는 제어신호를 보내고 레지스터에는 피연산자가 저장되어 있습니다.
이때 레지스터가 이용되는 이유는 메모리 접근 속도가 빠르기 때문입니다. 만약 레지스터가 아닌 일반 CPU를 통해 수행한다면 속도가 훨씬 느려지기에 프로그램의 실행 속도에도 영향을 줄 수 있습니다!
추가적으로 ALU는 계산 결과 외에 더불어 flag를 내보내는데 이는 결과에 대한 추가적 상태 정보를 의미합니다. 저는 플래그를 시스템프로그래밍에서 명령어의 추가적 인자들 관련해서 접했던걸로 기억하는데 컴퓨터구조 쪽에서도 플래그가 있었다니... 🫥
이 플래그들은 각각 다음의 플래그 레지스터들에 저장됩니다.
제어장치와 관련해 Clock이라는 중요한 개념이 등장합니다! 이는 시간의 단위이며 클럭의 주기에 맞춰 여러 작동이 수행이 됩니다.
위 사진의 예로 Clock cycle이 나오는데 이렇게 CC 마디마다 ALU나 Reg(Register) 와 같은 부품들이 딱딱 수행됩니다. 즉, 프로그램의 명령 순서에 따라 각 CC에 맞춰서 실행되는 모습을 볼 수 있습니다!
이렇게 알아야할 레지스터는 총 8개라고 하네요.
이때 스택 포인터가 있는 이유는 명령어 중에서 메모리에 잠깐 올려 두었다가 종료 전에 다시 해제하는 경우에 스택영역을 사용하는데 이때 마지막으로 저장한 값의 위치를 저장할 수 있도록 한 것입니다!
명령어 사이클은 명령어를 처리하는 그 흐름이라 할 수 있고 인터럽트는 이 흐름이 끊어지는 경우를 말합니다!
인터럽트는 여러 원인에 의해 발생할 수 있는데 공통된 기준은 없지만 동기/ 비동기 인터럽트로 나눌 수 있다고 합니다.
제가 컴파일러나 시스템프로그래밍 수업을 들으면서 이 예외처리 관련해서 여러 내용을 접할 수 있었는데 되게 흥미롭고 복잡하지만 재밌었습니다! 추가적인 '예외처리' 공부를 해보시는걸 추천드려요.
위 개념들을 참고해본다면 빠른 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 등과 같은 위험들에 따라 데이터 의존성이나 여러 위험들을 고려해서 좀더 속도를 빠르게 하는데 명령어 처리 순서를 바꿔도 결과에는 영향을 미치지 않는 그런 명령어를 먼저 실행해 파이프라인이 멈추는 것을 방지하는 기법.
🤯 저는 이 책에서 슈퍼스칼라와 비순차적 명령어 처리에 대한 개념을 처음 접해본거 같아요. 개인적으로 이 슈퍼스칼라에 대해 더 자세히 공부해보고 싶어지네요!
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) 코어와 스레드, 멀티 코어와 멀티 스레드의 개념을 정리하기
Q: 설명에 맞는 레지스터를 보기에서 찾아 빈칸을 채워 보세요.
Q: 멀티코어 CPU를 도식화한 그림에 용어 써넣기
A: 코어
ps. 방학 너무 빠르게 지나가네요... 요즘 양자컴 얘기가 많던데 양자컴퓨팅 관련해서 공부해볼까 해요 ㅎㅅㅎz
따라서! 방학동안에 목표는 프로젝트, 양자컴퓨팅 및 컴퓨터비전 공부하고 혼공족도 하구 여러 분야 찍먹하기! 😪