본문 바로가기

Lecture & Column/vga_lec_col

그래픽카드 성능의 비밀 : VGA 계산기 만들기

Author : Daeguen Lee

(Any action violating either copyright laws or CCL policy of the original source is strictly prohibited)

 



1. 개요

GPU의 처리과정을 대강 살펴보면 아래와 같습니다.

(식 1) 그래픽램에서 GPU로 운반 -> 쉐이더연산 -> 텍스처연산 -> 픽셀 렌더링 -> GPU에서 그래픽램으로 운반

여기서 빨간색 부분이 실제로 "연산" 이 일어나는 부분입니다.
(앞으로 위의 식에서 "연산" 부분에 관계된 변수는 빨간색으로 구분해 표시하겠습니다.)

위의 식에서 우리가 생각할수 있는 변수는 아래의 다섯 개입니다.

 

- 그래픽램-GPU 사이에서의 지연시간 (GPU 밖 지연, 메모리 대역폭에 반비례)
- GPU 내부, 각 유닛 사이에서의 지연시간 (GPU 안 지연, GPU 클럭에 반비례)
- 쉐이더가 연산되는 시간 (쉐이더 연산량에 비례, 쉐이더 연산속도에 반비례)
- 텍스처가 연산되는 시간 (텍스처 연산량에 비례, 텍스처 연산속도에 반비례)
- 픽셀이 렌더링되는 시간 (렌더링할 픽셀 양에 비례, 렌더링 연산속도에 반비례)

 

또한 위 다섯 변수를 구현하기 위해 아래와 같은 변수를 상정해야 합니다.

 

- 메모리 대역폭 (메모리클럭 x 메모리 비트레이트)
- GPU 클럭 (※ 쉐이더클럭과 GPU 도메인 클럭이 다른 경우는 쉐이더클럭도)
- 쉐이더 연산량 (S라는 문자로 나타내겠습니다. 이하 동일)
- 텍스처 연산량 (T)
- 렌더링할 픽셀 양 (R)
- 쉐이더 연산속도 (GPU의 쉐이더유닛 갯수 x 쉐이더 (or GPU) 클럭)
- 텍스처 연산속도 (GPU의 TMU 갯수 x GPU (도메인) 클럭)
- 렌더링 연산속도 (GPU의 ROP 갯수 x GPU (도메인) 클럭)

 

이 변수들을 이용해 처음의 식을 다시 쓰면 아래와 같습니다.

 

(식 2) GPU 밖 지연 + GPU 안 지연 + 쉐이더가 연산되는 시간 + 텍스처가 연산되는 시간 + 픽셀이 렌더링되는 시간

 

식 1에서 다시 각각의 '연산되는 시간' 항을 아래와 같이 풀어줄 수 있습니다.

 

(식 3) GPU 밖 지연 + GPU 안 지연 + S/쉐이더 연산속도 + T/텍스처 연산속도 + R/렌더링 연산속도

 

그리고 식 2는 다시 한번 아래와 같이 전개됩니다.

 

(식 4) GPU 밖 지연 + GPU 안 지연 + S/(쉐이더 갯수 x 클럭) + T/(TMU 갯수 x 클럭) + R/(ROP 갯수 x 클럭)

 

여기서 실질적으로 GPU 성능에 해당되지 않는 앞의 두 '지연' 항을 빼 보죠.

 

(식 5) S/(쉐이더 갯수 x 클럭) + T/(TMU 갯수 x 클럭) + R/(ROP 갯수 x 클럭)

 

얼핏 보기엔 복잡하지만 GPU 내부의 각 유닛이 주어진 연산을 수행하는 시간을 더한 것에 불과합니다.
(GPU가 연산을 수행하는데 걸린 '시간' 이므로 실제 성능은 이 값의 역수에 비례하겠죠?)
앞으로 각 항의 머릿글자를 따서 'S 항', 'T항' 등으로 부르겠습니다.

 

 


2. 실제 그래픽카드에 대입하기

 

그럼 식 5에 맞춰서 5870의 성능을 계량화해 봅시다.
5870은 1600개의 쉐이더, 80개의 TMU, 32개의 ROP를 가지며 GPU 클럭은 850MHz입니다.

(식 5a) 5870: S/(1600 x 850) + T/(80 x 850) + R/(32 x 850)

 

같은 방법으로 5850, 5830, 4890은 다음과 같이 나타내집니다.


(식 5b, 5c, 5d)

5850: S/(1440 x 725) + T/(72 x 725) + R/(32 x 725)
5830: S/(1120 x 800) + T/(56 x 800) + R/(16 x 800)
4890: S/(800 x 850) + T/(40 x 850) + R/(16 x 850)

 

여기서 주목할 부분이 있는데, 5830은 S항 및 T항이 4890에 비해 작지만 R 항이 4890보다 더 크겠죠?
(ROP 갯수가 같은데 GPU 클럭은 더 낮아서, 분모가 4890의 R항보다 작아지기 때문이죠)
다시 말해, 5830은 GPU 내부에서 쉐이더/텍스처 연산을 아무리 빨리 끝내더라도
모니터에 실질적으로 픽셀 단위로 그려 주는 픽셀 렌더링이 느리기 때문에 병목현상이 생긴다는 얘기입니다.

 

 


3. 모델 1: 쉐이더 중심

 

그럼 이제 S, T, R의 값을 가정해야 하는데, 대표적인 쉐이더중심 벤치마크인 3D마크를 생각해 봅시다.
3D마크는 쉐이더 연산량이 매우 많으므로 S가 굉장히 크고, 나머지 둘 (T, R) 은 매우 작다고 가정합시다.
그러면 위의 식 5들은 다음과 같이 줄여집니다.


(식 6a, 6b, 6c, 6d)

5870: S/(1600 x 850) = 이 결과값을 100% 라고 두면
5850: S/(1440 x 725) = 130.27%
5830: S/(1120 x 800) = 151.79%
4890: S/(800 x 850) = 200% 가 됩니다.

 

위 결과값들의 역수를 취하면 5850은 5870의 76.76%, 5830은 65.88%, 4890은 50%의 성능을 가지게 됩니다.
물론 여기에서 구한 연산성능이 곧바로 성능에 직결되는 것은 아닙니다.
예를 들어 우리가 위에서 생략한 '지연' 항들을 반영하면 % 차이는 조금 줄어들겠죠?
GPU가 연산을 수행하는 시간 : GPU 안 지연시간 : GPU 밖 지연시간의 비율이 2:1:1 이라면 어떻게 될까요?

 

(식 7a, 7b, 7c, 7d)

5870: 100% (연산시간) + 50% (GPU 안 지연시간) + 50% (GPU 밖 지연시간) = 200% (나누기 2 = 100%)
5850: 130% + 50% x 850/725 + 50% x (4800 x 256)/(4000 x 256) = 248% (124%)
5830: 152% + 50% x 850/800 + 50% x (4800 x 256)/(4000 x 256) = 270% (132%)
4890: 200% + 50% x 850/850 + 50% x (4800 x 256)/(3900 x 256) = 318% (156%)

 

예상했던 대로 '지연' 항들을 반영하자 각 카드들의 성능차이가 조금 줄어들었습니다.
결과값의 역수를 취하면 5850의 성능은 5870의 80.36%, 5830은 75.50%, 4890은 64.20% 가 되는데
이는 실제 3D마크 밴티지에서의 성능 차이와 흡사한 결과입니다.

 

 


4. 모델 2: 일반적인 게임

 

그럼 이제, 렌더링 성능이 중요한 요소가 되는 실제 게임의 상황을 가정해 봅시다.

앞서 3D 밴티지 모델에서는 GPU의 연산시간을 산출할 때 쉐이더 연산만 하는 것으로 가정했는데
실제 게임에서는 텍스처 및 렌더링 성능이 또한 중요한 요소가 됩니다. (그야 모니터에 그려내야 하니까...;;)
따라서 쉐이더 : 텍스처 : 렌더링의 비중이 각각 1:1:2 이라고 가정해 봅시다.


(식 8a, 8b, 8c, 8d)

5870: 100% (쉐이더 연산시간) + 100% (텍스처 연산시간) + 200% (렌더링 시간) = 400% (나누기 4 = 100%)
5850: 130% + 100% * (80 x 850)/(72 x 725) + 200% * (32 x 850)/(32 x 725) = 495% (124%)
5830: 152% + 100% * (80 x 850)/(56 x 800) + 200% * (32 x 850)/(16 x 800) = 729% (182%)
4890: 200% + 100% * (80 x 850)/(40 x 850) + 200% * (32 x 850)/(16 x 850) = 800% (200%)

 

결과값의 역수를 취하면 5850은 5870의 80.80%, 5830은 54.90%, 4890은 50%입니다.
3D마크 밴티지 모델 (식 6, 식 7) 에선 5870보다 많이 떨어졌던 5850의 연산성능이 조금 나아진 데 비해
ROP갯수가 적은 5830은 실제 게임 성능이 급격히 떨어진 것을 알 수 있습니다.
이제 여기에 GPU 안/밖에서의 지연시간 항을 더해 줍시다.

 

(식 9a, 9b, 9c, 9d)

5870: 100% (연산시간) + 50% (GPU 안 지연시간) + 50% (GPU 밖 지연시간) = 200% (나누기 2 = 100%)
5850: 124% + 50% x 850/725 + 50% * (4800 x 256)/(4000 x 256) = 242% (121%)
5830: 182% + 50% x 850/800 + 50% * (4800 x 256)/(4000 x 256) = 300% (148%)
4890: 200% + 50% x 850/850 + 50% * (4800 x 256)/(3900 x 256) = 318% (156%)

 

결과값의 역수를 취하면 5850은 5870의 82.52%, 5830은 67.74%, 4890은 64.20%가 됩니다.
5830의 성능이 순식간에 4890에 가깝게 떨어진 것을 볼 수 있습니다.
(현재 각종 벤치에서 4890에 뒤처지게까지 나오는 것은 드라이버가 최적화되지 않았기 때문인 것 같습니다.)

 

지금까지 이 간단한 방정식으로 살펴본 결과,
5830은 드라이버가 최적화 된 뒤에도 4890보다 크게 나은 성능을 보이진 않을 것으로 추측됩니다.
다만 ATi의 ATi Stream 등 GPGPU 기술이 널리 쓰이게 된다면
많은 쉐이더 갯수와 높은 클럭 (5850보다도 높은) 을 바탕으로 한 5830의 GPGPU 능력은 쓸만할 것 같습니다.


헥헥...... 여기까지 따라오셨다면 당신은 진정한 위너!!


5. 부록

지금까지의 식을 간단히 엑셀로 구현해 보았습니다.
엑셀파일을 실행하면 빨간색으로 표시된 부분에 테스트하고 싶은 그래픽카드의 스펙을 입력하게 되어 있고
그 아래에 네 가지의 모델이 주어져 있는데, 계산된 결과값이 표시되는 부분입니다.

모델 1은 위의 식 7을 구현한 "쉐이더 중심" 성능 계산입니다.
모델 2는 위의 식 9를 구현한 "일반적인 게임" 성능 계산입니다.
모델 3은 위의 식에는 없지만, "렌더링 중심" 성능 계산입니다. 2D/3D 그래픽 작업환경이 이에 해당됩니다.
모델 4 역시 위의 식에는 없는 "메모리 중심" 성능 계산입니다. 고해상도 설정과 유사합니다.

calc.xlsx


그럼... 재미없는 글을 끝까지 읽어 주셔서 감사합니다! :-)

 

//

 

(아래 위젯은 티스토리의 크라우드펀딩 시스템인 '밀어주기' 위젯입니다. 100원부터 3000원까지의 범위 내에서 글쓴이에게 소액 기부가 가능합니다. 사견으로는 이러한 형태의 펀딩이야말로, 성공적으로 정착될 경우 이해관계자로부터 독립된 벤치마크가 지속가능해지는 원동력이 될 것이라 생각합니다. 제가 작성한 글이 후원할만한 가치가 있다고 여기신다면 밀어주기를 통한 후원을 부탁드립니다. 물론 글을 '가치있게' 쓰는 것은 오롯이 저의 몫이며, 설령 제 글이 '후원할 만큼 가치있게' 여겨지지는 못해 결과적으로 후원을 받지 못하더라도 그것이 독자 여러분의 잘못이 아니란 건 너무 당연해 굳이 언급할 필요도 없겠습니다. 저는 후원 여부와 관계없이 제 글을 읽어주시는 모든 독자분께 감사합니다.)