응애맘마조
230420 강의 본문
D3D를 들어가기 전 더 기초가 되는 컴퓨터공학에 대해서부터 시작을 했습니다.
작성한 코드도 텍스트입니다. 그렇기 때문에 메모장이나 Visual Studio에 작성해도 똑같습니다. 하지만 컴파일러나 라이브러리등 메모장에는 존재하지 않기 때문에 작성해도 실행은 할 수 없습니다.
(이외로 Visual Studio Code가 있지만 컴파일러가 없기 때문에 권장하지 않습니다.)
IDE(Integrated Development Environment)는 통합 개발 환경입니다. 컴파일러가 내장되어 있습니다.
컴파일 또는 빌드는 텍스트로 작성한 코드를 디스크 작성 메모리에 저장을 해서 exe파일로 바꾸는 작업을 합니다. 이 작업은 프로세스 메모리에 저장이 됩니다. 따로 프로세스 메모리를 두는 이유는 CPU는 디스크의 메모리에 접근할 수 없습니다. 그리고 디스크 메모리는 느리다는 단점도 있습니다. 그래서 RAM의 용량이 한계까지 사용하게 되면 가상 메모리인 주기억 장치를 사용하기 때문에 느려집니다. 그래서 적절히 사용하고 공간을 남겨서 느려지지 않도록 하는 것을 권장합니다.
접근에는 순차 접근과 임의 접근이 있습니다.
순차 접근(Sequential Access)은 파일의 다음 부분부터 차례로 읽어 나가며 비디오테이프나 카세트테이프, 그리고 하드 디스크에 사용합니다.
임의 접근은 대표적으로 RAM(Ramdom Access Memory)이 있고 순차 접근에 사용되는 테이프처럼 되감기나 빨리 감기가 없어서 메모리 주소에 접근해 임의의 위치에 접근을 할 수가 있습니다. 예를 들어 유튜브 동영상처럼 원하는 영상 시간대로 바로 갈 수 있다는 것입니다. 이때는 영상의 시간이 메모리의 주소가 됩니다. 낮은 주소부터 높은 주소까지 1byte당 주소가 매겨집니다. 이때 byte는 데이터상 RAM에서의 최소 접근 단위입니다. (자료형 bool에서 보면 0과 1만 사용하는 bit만 사용하는 데에도 크기는 1byte인 이유도 최소 접근 단위가 byte이기 때문입니다.)
CPU에도 메모리가 존재합니다. 캐시, 레지스터가 있습니다.
먼저 캐시는 중간 메모리 같은 개념입니다. 메모리가 부족하게 되면 RAM으로 접근하게 되는데 자주 사용하는 데이터나 값을 저장하는 곳인데 RAM에 접근하게 되면 당연히 느려질 수밖에 없습니다.
캐시 내에서도 메모리에 접근할 때 같은 메모리에 여러 번 접근하는 것을 피하기 위해 바이트 패딩이 필요합니다.
바이트 패딩은 4byte 단위나 8byte로 메모리를 잡는 것입니다. 예를 들어 자료형의 bool은 1byte인데 여기에 3byte를 추가해 4byte로 맞춤으로써 다른 메모리에 접근 시 여러 번 접근하여 느려지는 현상을 막기 위해서 사용하게 됩니다. 그래서 4byte인 int 자료형이 가장 확실하고 빠르게 볼 수 있습니다. 이외로 상수버퍼에서는 int보다 float이 더 빠릅니다. 부동 소수점에 최적화가 되어있기 때문입니다.
이때 중요한 것이 캐시 히트(Cache Hit)와 캐시 미스(Cache Miss)입니다. 이 둘은 게임 성능에 직접적인 영향을 주기 때문에 많이 중요하다고 했습니다.
캐시 히트(Cache Hit)는 CPU가 접근하는 데이터에 캐시가 존재하는 경우에 처리가 되는 과정을 말합니다.
캐시 미스(Cache Miss)는 CPU가 접근하는 데이터에 캐시가 없을 경우에 메모리에 접근하여 데이터를 캐시에 로딩하는 과정입니다.
그렇기 때문에 캐시 미스가 적을수록 처리 속도가 빨라집니다.
(번외적으로 게임 프로그램은 객체 지향인 OOP로 설계를 하게 되는데 각각 객체 간 명령이 다릅니다. 그래서 캐시 미스가 나는 것이 굉장히 쉬운데 이를 줄이기 위해서는 데이터 지향인 DOD로 설계를 하면 되는데 이는 게임 프로그래밍과는 맞지 않은 설계 방식이기 때문에 현재도 엔진에서 바꿀 수 있도록 조정 중입니다.)
다음 레지스터는 CPU가 갖는 가장 작은 메모리의 단위입니다.
x86이 32비트, x64가 64비트인데 이 비트가 레지스터의 단위입니다.
스레드(Thread)는 프로세스와 연관이 되어 있는데 코어 수에 따라 동시에 처리할 수 있는 작업량이 달라집니다.
여러 작업을 동시에 동작시키는 것을 멀티 스레드라고 합니다.
(어제의 과제에서 사용 중인 CPU를 벤치 마킹 했을 때 스레드가 12인 것을 확인했는데 이는 하나의 프로그램 안에서 동시에 가능한 작업이 12개라고 볼 수 있습니다.)
스레드로 CPU와 GPU의 차이를 볼 수 있는데
CPU는 복잡한 계산을 하나씩 하기 위해 설계되어 있고
GPU는 단순한 계산을 한꺼번에 처리하기 위해 설계되어 있는 것을 알 수 있습니다.
읽어주셔서 감사합니다.