비디오 카드의 정의

2013.11.30 03:55

단장 조회 수:167

먼저, 저는 비디오카드 만드는 쪽은 아니고 쓰는 쪽이라;;; 너무 깊은 질문은 곤란합니다 ^^;


1. 비디오카드란?
요즘 비디오 카드는 극단적인 형태를 띠고 있습니다.
원래 비디오 카드는 버스 브릿지+비디오 액셀러레이터+DAC+메모리 로 구성되어 있는데... 요즘은 액셀러레이터가 엄청 비대해졌지요. 이게 다 3D때문인데요, 간단하게 3D가 그려지는 과정을 보자면...

필요한 데이터는 공간좌표 최소 3개(삼각형 하나를 구성하기 위한 최소단위, 이것도 로컬좌표 및 월드좌표로 나뉩니다), 라이팅을 위한 공간벡터 삼각형 꼭지점당 하나씩 도합 3개, 라이팅을 위한 최소한의 방향벡터 하나(빛의 방향)와 RGB컬러값 하나(빛의 색깔), 삼각형에 입힐 텍스처 한장, 그리고 카메라의 위치 및 카메라의 FOV(시야각)값+최소거리 최대거리 해서 보통 뷰프러스텀이라는 말로 표현합니다만... 여튼 이렇게 하면 공간상에 삼각형 판떼기 하나 그릴 수 있습니다. 사실 최소단위로만 표현하자면 더 줄일 수 있지만...

조금 더 심화해서 설명해 볼께요. 어려울 수 있으니 최대한 말은 풀어쓰고, 복잡한 수식은 생략합니다 ^^;

공간도형의 좌표가 위에서 로컬 좌표와 월드 좌표로 나뉜다는 얘기를 했는데요, 쉽게 생각하면 월드 좌표는 2D그래픽스의 화면 좌표를 생각하시면 됩니다. 다만 3D는 좌표부터 세개(XYZ)인데다가 돌리거나 축소 확대 정보까지 월드 좌표가 다 가지고 있어서 실제로는 좌표가 아닌 4x4행렬로 표현하게 되구요, 요거시 월드 트랜스폼 혹은 월드 매트릭스(행렬)라고 보통 얘기들 합니다. 그리고 로컬 좌표는 말 그대로 크기 1x1x1의 정육면체 안을 기점으로 해서 그 안에다가 폴리곤을 꾸겨 넣어 놓은 겁니다. (사실은 굳이 1x1x1이 될필요는 없습니다만...) 로컬 좌표안에 들어있는 폴리곤 좌표들에다가 월드 매트릭스를 곱하면, 지금 우리가 표현하고자 하는 월드 좌표가 꼭지점(정점=버텍스)마다 뿅뿅 튀어 나오지요.

우리의 모니터가 3차원 공간모니터라면 더 이상의 복잡한 수식은 없겠습니다만, 아쉽게도 그렇지 않고 대다수 모니터는 평면이지요. 그래서 우리는 변환된 월드 좌표들을 모니터의 좌표로 바꾸어야 합니다. 고등학교 시간에 정사영(=투영)이라는 말을 들어 보셨을텐데... 적절한 공식을 통해 3차원 월드 정점들을 2차원 모니터 정점 좌표로 바꾸는 과정을 뷰프로젝션 변환이라고 하고, 여기에는 월드 행렬처럼 4x4 행렬(뷰 행렬, 프로젝션 행렬) 두개를 씁니다. 뷰 행렬은 카메라(혹은 시점)정보를 통해 월드 정점들 좌표를 시청자... 의 시점 좌표로 바꾸는 것이고, 프로젝션 행렬은 시점 좌표를 모니터 좌표로 바꾸는 겁니다.

이 다음은 만든 정점들 사이를 채우는 것이겠지요. 이 과정을 래스터라이징이라고 하구요, 이 때 텍스처정보 및 정점 법선(노말)등을 요래조래 섞어서 한땀한땀 픽셀을 만들어 화면을 채웁니다. (=요 속도를 필레이트라고 부르며 가속기의 중요 스펙 중 하나입니다) 요즘은 이 중간 중간에 테셀레이터도 섞고, 래스터라이징 과정에서도 후처리를 섞어서 요런 저런 효과를 줍니다. 

여기까지 읽으셨으면, 눈치 빠른 분이나 이공계전공자분들은 뭔가 느낌이 오실겁니다. 모조리 행렬의 덧셈곱셈연산으로 꽉 차 있고, 계산이 거의 다이며, 조금 더 센스가 충만하다면 부동소수점 연산+선형대수+삼각함수 연산이라는 것입니다. 더 센스가 충만하시다면 분기(if명령어)가 거의 없다시피한것도 아실거구요. 쉽게 말해 비디오 카드는 거대한 행렬 연산기라고 보시면 됩니다. CPU에서 SSE같은 SIMD만 거대하게 불려 놓은 형태입니다. 보통 이런 구조의 계산기는 트랜지스터를 때려박은 만큼 성능(FLOPS)이 올라갑니다. 그래서 고급 카드와 보급 카드의 성능차이가 뚜렷하지요. (덧붙여서 가격 차이도 분명하구요...)



2.비디오 카드의 스펙은?
위에서 말씀드렸듯이 벡터 연산장치(=행렬연산기)가 얼마나 많이 들었으며, 한번에 얼마나 많이 올려서 계산이 가능하며, 한번에 얼마나 많이 결과물을 뱉어 낼 수 있느냐입니다. 실제로 SIMD 어셈블리를 많이 다뤄 보신 분이라면, 데이터를 계산유닛에 올리고 계산한 후 튀어나온 결과를 받아 오는 과정이 생각보다 순탄치 않음을 아실겁니다. 데이터를 올리고 내리는 과정이 겁나 비싸기 때문이지요. 그래서 할 수 있다면 대역폭까지 꽉꽉 채워서 한꺼번에 올리고, 한꺼번에 계산하고, 한꺼번에 받아 오는 것이 하나하나 올리고 계산하고 내리고 하는 것보다 훨씬 빠릅니다. 다행스럽게도 그래픽 데이터는 별다른 최적화가 없어도 연산 자체가 그러하기 때문에 별 다른 건 없고, 데이터 업로드 다운로드가 다 버스트 전송이라는 것 정도네요. (=한꺼번에 많이 보내서 전송 속도를 빠르게 하는 것)

매 프레임 대용량 데이터를 수도 없이 업로드 다운로드하기 때문에, 비디오 카드의 병목은 생각보다 메모리 대역폭에 많이 집중됩니다. 대역폭은 클럭 곱하기 비트수니까, CPU와는 다르게 비디오 카드는 메모리버스의 스펙이 급 별로 차별화 되어 있고, 상대적으로 고급 메모리 (GDDR)등을 많이 씁니다. 버스 수가 크고, 중첩도 가능하고, 클럭 자체도 빠른데 모두 대역폭과 관계 있는 사양이죠. (하긴 메모리에 대역폭 말고 뭐가 있겠습니까만...) 아무리 벡터 유닛이 빨라봤자 메모리 병목이 발목을 잡을 수 있기 때문에, 벡터 유닛 연산량(GFLOPS)에 어느 정도 따라 맞춰서 대역폭을 올리는 것이 효율이 좋습니다. 반대로 메모리 대역폭이 크고 셰이더 유닛(벡터연산기)가 작을 경우도 있긴 한데... 보통 비디오 카드 특성상 웬만큼 연산량이 느려도 대역폭은 꽉 차게 되므로 나쁘게 볼 수는 없습니다. 물론 이 경우는 단가 문제가 더 커서, 결국은 절충안을 찾게 되지요.

메모리 대역폭은 생각보다 중요한데, 왜냐면 비디오 카드가 직접 하드디스크를 읽어서  그래픽 데이터를 읽지는 않기 때문입니다. 보통은 CPU레벨에서 읽어 메인 메모리에 먼저 로딩한 후, PCIe의 버스트 전송으로 비디오 메모리로 올리는데 보통 GPU에는 PCIe브릿지가 내장되어 있고 그래서 비디오 카드의 메모리 대역폭에 비례해 cpu->gpu 데이터 전송 속도가 결정됩니다. 요즘은 셰이더 유닛이 많이 좋아져서 꽤 많은 연산들을 CPU에서 하지 않아도 되긴 합니다만, 그래도 CPU는 필요하기에 대역폭이 이 때에도 발목을 잡는다는 걸 알아두시면 되겠습니다.

그 다음이 보통 셰이더 유닛이라고 부르는 벡터 연산기의 덩어리인데... 위에도 설명했습니다만 분기가 거의 필요없고 한번에 빠르게 많은 실수 데이터를, 주로 선형적으로 계산하는 기능을 하는 회로입니다.

댓글 0

파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
64 문길 설치법 단장 2017.04.19 20
63 진 여신전생 스트레인지 저니 에디터 코드 단장 2015.06.18 143
62 VC 2012이후에서 릴리즈 빌드 스택변수들 디버깅하기 file 단장 2014.03.05 217
61 Large Address Aware file 단장 2014.03.05 619
60 빠른 1/sqrt(n) 계산방법 단장 2014.03.05 412
59 마포에서 AF되는 포서드용 렌즈들 단장 2014.02.13 180
58 디카 이미지 슬라이드필름처럼 보정하기 file 단장 2014.02.13 156
» 비디오 카드의 정의 단장 2013.11.30 167
56 Windows 8.1 복구 파티션 만들기 단장 2013.11.13 6094
55 마력 구하는 공식 단장 2013.07.11 1152
54 [공지] 게시판 용도 김도완 2005.06.16 1094
53 Stream of Life 단장 2009.06.29 1152
52 골프의 물리학 단장 2009.05.30 1549
51 Fast Bit Counting 단장 2009.02.21 1606
50 vTune 사용법 단장 2009.01.13 1237
49 제트 추력 엔진 단장 2008.04.29 1440
48 std::tr1 단장 2008.03.13 1310
47 일본어 날짜 단장 2008.02.19 1132
46 Networking Best Practices in XBOX360 단장 2007.12.19 1486
45 개인적으로 만들어 본 리눅스 게임 서버 FAQ 단장 2007.11.27 1108