-
그래픽스는 CPU 와 GPU가 병렬로 진행된다.
- CPU: 명령 목록 작성 및 제출.
- GPU: 제출된 명령 목록을 읽어서 처리.
-
성능의 관점에서 보면, 기본적으로 하드웨어 자원을 최대한 활용하는것이 좋다.
- 그러기 위해서는 CPU, GPU를 최대한 활용해야 한다.
-
하지만, CPU와 GPU의 동기화 기법을 사용하다보면 어쩔 수 없이 한쪽은 쉬는 상황이 발생한다.
(GPU가 자원을 사용하는 동안에는 CPU에서는 건들 수 없다)
- CPU가 명령 목록을 작성하고 제출한다.
- 이때 펜스를 설정하고 GPU에서 작업이 끝날때 까지 기다린다.
- GPU는 명령 목록이 제출될때까지 기다린 후 제출되면 처리한다.
- 위의 상황처럼 CPU는 제출이후 GPU가 작업을 완료할때까지 기다려야한다.
- 또 반대로 GPU는 CPU에서 명령 목록이 제출될때까지 기다려야한다.
-
이처럼 CPU와 GPU가 할 일 없이 시간을 허비하게 되는 것을 막기위한 방법으로 같은 자원을 여러벌을 준비해서 순환 시키는 방법이 있다.
- 이를 순환 배열(circular array) 라고 한다.
-
즉, 하나의 프레임에 필요한 자원들을 하나의 프레임 자원으로 만들고 이러한 프레임 자원을 3개를 만들어서 각 프레임마다 돌아가면서 사용하는 방식이다.
- 가용 가능한 프레임 자원을 이용해서 CPU는 GPU에게 넘길 명령 목록을 미리 만들 수 있게 된다.
-
아래 그림은 책 예제에서 프레임마다 필요한 자원들을 모아둔 구조체이다.
- 물론 이 방법이 완벽한 해법은 아니다.
- CPU가 훨씬 빠르거나, GPU가 훨씬 빠른 경우에는 한쪽이 노는 현상은 여전히 일어난다.
- 하지만, 둘중 하나의 상황에 맞춰서 일을 분배하는 방식을 통해서 성능을 최적화할 수 있다.