2025. 9. 15. 13:34ㆍCSAPP
프로그램의 성능, 즉 실행속도를 빠르게 하려면 어떻게 해야 할까?
오늘은 프로그램의 성능 향상에 관한 내용을 다룬다.
1. 암달의 법칙
우리가 시스템의 한 부분의 속도를 증가시킬 때, 전체 시스템의 성능 향상 정도는
그 부분이 전체 실행 시간에서 차지하는 비율과 얼마나 속도를 올렸는지에 달려 있다.
이때 성능 향상은 암달의 법칙으로 계산할 수 있다.

예를 들어보자.
만약 GTX1060을 쓰면서 배그를 하던 내가 gpu만 RTX4070으로 바꿨다면?
성능은

이런식으로 계산되어
기존의 프레임이 60FPS정도 나왔다면, 106FPS정도 나오게 바뀐다.
만약 그럼 GPU 대신, RAM을 기존 16GB에서 32GB로 바꾸면 어떻게 될까?

RAM의 용량을 업그레이드 하면
기존의 60FPS가 63.2FPS정도 나오게 바뀐다.
GPU를 바꿀때는 많은 영향이 생기는데, RAM을 교체할때는 그러지 않은 이유는 뭘까?
성능 향상을 크게 체감하려면, 전체 실행 시간에서 비중이 큰 병목 구간(GPU, CPU 연산 등)을 개선해야 한다.
RAM은 일정 이상만 확보되면 게임 성능에 큰 영향을 주지 않지만,
GPU는 게임 성능에서 차지하는 비중이 크기 때문에 업그레이드 효과가 매우 크다.
전체 시스템 속도 향상을 위해서는 전체 시스템의 매우 큰 부분을 차지하는 것의 성능을 개선해야 한다.
2. 동시성과 병렬성
시스템 속도 향상을 위해 반드시 하드웨어 사양만 올리는 방법만 있는 것은 아니다.
우리가 프로그램 구조를 개선하거나 컴퓨터를 더 효율적으로 부려먹으면, 같은 시스템에서도 성능을 높일 수 있다.
컴퓨터 역사에서 사람들은 항상 더 많은 일을, 더 빠르게 수행하기를 원했다.
이에 대한 해결책 중 하나는 프로세서가 게을러지는 것을 방지하기 위해,
프로세서에게 더 많은 일을 동시에 수행하도록 하는 것이다.
프로세서를 부려먹는 방법은 2가지가 있는데, 동시성과 병렬성이다.
여기서 여러 작업을 동시에 수행하는 것을 동시성이라고 한다.
동시성은 실제로 모든 작업이 동시에 실행되는 것은 아니지만,
CPU가 매우 짧은 시간 단위로 작업을 번갈아 처리하여 사용자 입장에서는 동시에 실행되는 것처럼 보이게 한다.
예를 들어, 한 코어 CPU에서 웹 브라우저와 음악 재생을 번갈아 실행하면,
사용자는 두 프로그램이 동시에 작동하는 것처럼 느낀다.
이러한 시분할 기법을 시간 공유라고 한다.
반면, 병렬성은 여러 작업이 실제로 동시에 실행되는 것을 말한다.
멀티코어 CPU나 GPU에서 여러 연산을 동시에 수행할 수 있어, 성능 향상 효과가 크다.
단일 프로세서 시스템에서는 시분할로 동시성을 구현하지만,
멀티 프로세서 시스템에서는 여러 코어가 병렬로 계산을 수행할 수 있다.

예를 들어, 4코어 CPU가 4개의 계산을 동시에 처리하거나 GPU가 수천 개 코어로 그래픽을 렌더링하는 것이 병렬성의 대표적인 사례이다.
또한, 하나의 물리적 코어가 여러 스레드를 동시에 처리하도록 하는 하이퍼스레딩(= 인텔 멀티스레딩)기술이나,
프로그램을 여러 스레드로 나누어 동시에 실행하는 스레드 수준 동시성도 병렬성을 활용한 성능 향상의 방법이다.
예를 들어 게임에서는 AI 계산과 물리 엔진, 그래픽 렌더링을 각각 별도 스레드에서 처리하면,
프레임이 안정화되고 전체 성능이 향상된다.
전체 프로그램에서 병목 구간이 큰 부분을 병렬 처리하면 성능 향상 효과가 크다
암달의 법칙으로 계산하면,
병목 구간이 전체 실행 시간에서 차지하는 비율 P와
병렬화로 빨라진 배수 S(parallel)에 따라 속도 향상이 결정된다.
즉, 병목 구간을 효율적으로 병렬화할수록 시스템 속도가 더 빨라진다.
따라서 단순히 하드웨어를 업그레이드하지 않아도,
동시성과 병렬성을 이용하여 프로그램 구조를 개선하면 같은 시스템에서도 성능 향상을 얻을 수 있다.
GPU 연산, 멀티스레드 처리, 분산 시스템 등이 바로 이러한 병렬화 기법의 대표적인 예이다.
3. 스레드와 성능 향상
동시성과 병렬성을 활용하려면 스레드라는 개념이 매우 중요하다.
프로그램이 실행될 때, 빠른 데이터 처리를 위해 스토리지에 저장된 프로그램의 일부가 메모리에 상주하게 되는데,
실행 중인 프로그램을 프로세스라고 부른다.
과거에는 프로세스가 곧 작업 단위로 동작했지만,
프로세스 전환 시 발생하는 컨텍스트 스위치 오버헤드가 커서 효율성이 떨어졌다.
이 문제를 해결하기 위해, 프로세스를 여러 개의 작은 단위, 즉 스레드로 나누어 실행하면 오버헤드를 줄이고 효율성을 높일 수 있다.
스레드는 일의 처리 흐름 단위이며, 여러 스레드가 존재하면 이를 멀티스레드라고 부른다.
이렇게 나누어 작업을 수행하는 것을 멀티스레딩이라고 한다.
1950년대부터 이러한 개념이 정립되어, 오늘날까지 프로그램의 최소 처리 단위로 스레드를 사용하고 있다.
사람으로 비유하면, 덩치 큰 한 사람(프로세스)보다 여러 명의 작은 사람들(스레드)이 협업하여 일을 처리하는 것이 효율적인 구조와 비슷하다.
스레드의 장점은 동시성과 병렬성을 세분화된 단위로 구현할 수 있다는 점이다.
예를 들어, 게임에서는 AI 계산 스레드, 물리 엔진 스레드, 그래픽 렌더링 스레드를 각각 별도의 스레드에서 실행할 수 있다.
이렇게 하면 CPU나 GPU가 각 스레드를 병렬로 처리하여 전체 성능이 향상된다.
하나의 CPU 코어가 여러 스레드를 처리할 수 있도록 지원하는 하이퍼스레딩 기술을 활용하면,
코어 자원을 효율적으로 사용하여 성능을 더 높일 수 있다.
멀티스레딩에는 크게 두 가지 방식이 있다.
- 시간적 멀티스레딩(TMT)
- 한 번에 하나의 스레드만 실행하지만, 시간 단위로 스레드를 번갈아 수행
- 협동형과 선점형 방식 존재
- 싱글코어 CPU에서도 적용 가능하며, 제한된 자원으로 멀티태스킹을 구현할 수 있다.
- 동시 멀티스레딩(SMT)
- 여러 스레드를 동시에 실행하여 유휴 자원을 최대한 활용
- 시간적 멀티스레딩의 한계를 극복하고 더 높은 성능 제공
- CPU와 소프트웨어가 이를 제대로 지원해야 성능을 발휘할 수 있다.
스레드를 적절히 나누어 병렬로 실행하면, 프로그램 내 병목 구간을 분산 처리할 수 있으며,
암달의 법칙에서 보듯이 병목 구간 비중이 큰 부분일수록 시스템 성능 향상 효과가 크다.
즉, 스레드는 동시성과 병렬성을 실제로 구현하는 핵심 단위이며,
단일 프로세서, 멀티코어 CPU, GPU 연산 등 다양한 환경에서 프로그램 성능을 높이는 중요한 방법이다.
4. 인스트럭션 수준 병렬성과 SIMD/SIMT
프로세서의 성능을 높이는 또 다른 방법은 스레드 수준을 넘어, 한 코어 안에서 여러 명령어를 동시에 실행하는 것이다.
이를 인스트럭션 수준 병렬성(ILP)이라고 한다.
프로세서는 여러 명령어 중 서로 의존성이 없는 명령어들을 동시에 실행하여 처리 속도를 높일 수 있다.
예를 들어, 덧셈과 곱셈 연산이 서로 다른 레지스터를 사용한다면, 이 두 연산을 병렬로 수행할 수 있다.
또한, SIMD(Single Instruction, Multiple Data)나 SIMT(Single Instruction, Multiple Threads) 기술을 활용하면,
같은 연산을 여러 데이터에 동시에 적용할 수 있다.
- SIMD는 CPU에서 한 명령어로 여러 데이터를 동시에 처리하는 방식이다. 예를 들어, 벡터 덧셈이나 이미지 처리에서 유용하다.
- SIMT는 GPU에서 사용되는 방식으로, 한 명령어를 수천 개의 스레드에 동시에 적용하여 그래픽 렌더링이나 대규모 연산을 빠르게 수행할 수 있다.
즉, 스레드 수준의 병렬성뿐만 아니라, 한 코어 내 명령어 단위와 데이터 단위까지 병렬화하면 프로그램 성능을 더 높일 수 있다.
5. 컴퓨터 시스템에서 추상화의 중요성
컴퓨터 시스템은 매우 복잡하다. CPU, 메모리, 저장 장치, 네트워크 등 여러 하드웨어와 소프트웨어가 동시에 동작하며,
각각의 세부 동작까지 모두 이해하고 관리하기는 거의 불가능하다.
이때 사용하는 것이 추상화이다.
추상화는 복잡한 시스템을 단순한 계층이나 개념으로 나누어,
세부 구현에 집중하지 않고도 전체를 이해하고 효율적으로 사용할 수 있게 해 준다.
예를 들어, 프로그래머는 CPU 내부의 캐시 동작이나 명령어 파이프라인을 모두 알 필요 없이,
변수, 함수, 라이브러리와 같은 고수준 개념으로 프로그램을 작성할 수 있다.
운영체제는 하드웨어를 직접 다루는 대신, 파일 시스템, 프로세스 관리, 메모리 관리 등 추상화된 인터페이스를 제공한다.

즉, 추상화를 통해 복잡한 하드웨어와 소프트웨어를 계층화하고,
각 계층은 자신의 역할만 신경 쓰면 되므로 시스템 설계와 프로그램 개발을 훨씬 효율적이고 안정적으로 만들 수 있다.

위 영상은 추상화의 예시인 유니티 엔진의 RigidBody이다.

유니티에서는 중력과 충돌같은 물리 작용을 내부 작동원리를 확인할 필요없이 UI로 조절하여 오브젝트에 적용할 수 있다.
어떻게 보면 저런식으로 랜더링 되는 것도 내부 원리를 몰라도 조절 되기에 추상화라고 할 수 있다.
'CSAPP' 카테고리의 다른 글
| [Week3 - CSAPP] 3.2 - 프로그램의 인코딩 (0) | 2025.10.01 |
|---|---|
| [Week3 - CSAPP] 3.1 - 역사적 관점(근데 약간 이상한) (0) | 2025.09.19 |
| [Week1 - CSAPP] 1.5 - 캐시가 중요하다. (0) | 2025.09.08 |
| [Week1 - CSAPP] 1.4 - 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다. (0) | 2025.09.08 |
| [Week1 - CSAPP] 1.3 - 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다. (0) | 2025.09.06 |