블로그는 나의 힘!
[ Programing ]/DirtectX92010. 6. 1. 04:48

 

1.     레지스터(Register)?

 

레지스터의 일반적인 정의를 보면 컴퓨터의 중앙처리장치(CPU)에 들어있는 소규모 데이터 기억장치이며, 연산 장치와 내부 버스(bus)를 통해 연결되어 있다 라고 되어 있다.

여기서 중요한 핵심은 레지스터가 CPU 안에 들어있는 기억장치라는 점이다.

CPU 안에 들어 있으므로 컴퓨터 내부에서 가장 빠른 기억장치가 바로 레지스터라는 것을 말하는 것이다.

 

하지만 레지스터는 저장 용량이 크지 않고 저장 상태가 영구적이지 못하다는 점을 이해해야 한다.
그렇다면 왜 레지스터라는 것을 사용할까?

예를 들어 연산 장치가 1+1 이 얼마인지 계산해야 한다면, 연산장치는 우선 데이터를 가장 빠른 방법으로 받아들이고 그 결과를 가장 빠른 메모리에 넣어 놓아야 다음 연산에서 필요할 때 다시 빠르게 꺼내어 사용할 수 있을 것이다.
이때 연산에 사용되는 값들을 넣어놓고 연산 과정이나 결과값 저장에 사용하는 메모리 부분이 바로 레지스터다.


 

2.     3D 가속 그래픽 카드

 

3D 가속 그래픽 카드라는 말을 따로 사용할 필요가 없을 정도로 이제는 대부분의 그래픽 카드에 3D 연산을 할 수 있는 기능이 포함되어 있다.

 

그렇다면 3D 연산이라는 것은 무엇을 말할까?

우리가 최종 결과물을 보는 모니터는 픽셀 단위로 표현이 이루어지는 2D 출력장치다.

따라서 아래 그림을 보면 2D 이미지의 경우 이미지의 구성 자체가 픽셀단위로 이루어져 있으므로 화면에 출력할 때 특별히 연산을 할 필요 없이 바로 데이터 전달이 가능하다.

그렇지만 3D 공간 데이터의 경우 화면에 출력하려면 화면과 같은 구성을 가진 데이터로 변환해야 하므로 픽셀 단위로 변환하는 과정이 반드시 필요하게 된다.

버텍스로 이루어져 있는 공간 데이터를 평면상의 픽셀 정보로 바꾸어 주는 과정을 바로 3D 연산이라고 표현한다.

 

(그림 1) rendering_2d and 3d.ppt


이전에는 3D 연산과 출력에 필요한 모든 계산을 CPU가 해야만 했다. 따라서 컴퓨터의 속도가 아무리 빠르더라도 실시간으로 많은 계산을 요구하는 3D 게임과 같은 내용을 표현하기에는 어려움이 많았다.

그래서 CPU를 도와줄 보조 연산장치를 그래픽 카드에 포함시켜주게 된다. 그리고 그래픽 카드로 전달되는 데이터에 대한 연산과 처리를 CPU대신 담당할 수 있도록 권한을 부여하고, 그 시간에 CPU는 다른 연산을 할 수 있도록 하였다.

이 보조 연산 장치가 GPU 이며, GPU를 이용하여 3D 연산 처리를 빠르게 할 수 있는 그래픽 카드를 3D 가속 그래픽 카드라고 이야기하는 것이다.

 

GPU는 그래픽 카드를 총괄하는 작은 CPU라고 이야기 했다.

GPU는 특히 3D 변환 연산에 최적화된 수학적 연산을 수행할 수 있도록 구조가 설계되어 있으며, 연산을 빠르게 하기 위해 내부에 많은 레지스터를 가지고 있다.


 


3.     레지스터의 종류와 셰이더

 

레지스터는 역할에 따라 크게는 입력을 받아들이는 입력 레지스터와 결과를 저장하는 출력 레지스터로 구분될 수 있으며, 좀 더 세분화된 기능으로 구분한다면 다음의 네가지로 구분될 수 있다.

(1)   입력 레지스터

(2)   출력 레지스터

(3)   임시 레지스터

(4)   상수 레지스터

 

레지스터는 각각 기능이 지정되어 있으므로 무조건 개수만 많다고 좋은 것은 아니다.

필요한 기능, 연산에 많이 사용되는 레지스터가 많아야 하며, 셰이더 버전별로 종류와 개수는 차이가 있다.

다음의 두 가지 표는 입출력 레지스터의 종류와 셰이더 버전별로 지원되는 개수를 요약해 놓은 것이며, 어셈블리어로 셰이더 코드를 작성한다면 반드시 알아야 하겠지만, 
여기선
 HLSL을 위주로 사용하므로 개념정도만 이해하면 될 것이다.

(그림 2) input register.ppt

b# 과 같이 #이 붙어있는 레지스터는 b0, b1과 같이 이름이 지정되어 있다는 뜻이다.

 

(그림 3) output register.ppt


레지스터는 셰이더 종류별로 각각 구성되는 묶음이 정해져 있다.

 


4.     레지스터의 구조

 

레지스터는 기본적으로 16바이트로 되어 있으며, 4바이트 변수 4개가 마치 구조체처럼 포함되어 있는 구조다.

레지스터의 각 4바이트 단위는 각각 x,y,z,w 라는 이름을 가지고 있습니다. 특징적인 사항은 각 4바이트에는 x,y,z,w 이외에 r,g,b,a 라는 이름도 함께 사용할 수 있다는 점이다. 따라서 c0 라는 레지스터가 있을 때 c0.x ,  c0.r 과 같이 구조체 멤버 변수를 사용하듯이 각각의 단위를 불러서 사용할 수 있다.

 

 


5.     버텍스 셰이더와 레지스터

 

셰이더라는 것은 ALU (Arithmetic Logic Unit) 라고 하는 연산 장치와 연산에 필요한 레지스터들을 모아서 특정 기능에 적합하게 연결해놓은 단위라고 생각할 수 있다.

따라서 버텍스 셰이더와 픽셀 셰이더는 각각  ALU, 입출력 레지스터, 임시레지스터, 상수 레지스터를 가지고 있다고 생각하면 된다.

 

우선 버텍스 셰이더의 구조를 살펴보면 다음과 같다.

(그림 4) vertex shader arch.ppt

(자료 출처) 용준. 셰이더 프로그래밍

 

위 그림에서 각 레지스터의 특징을 간단히 살펴 보겠다.

우선 입력 레지스터를 살펴보면 v0 ~v15까지 총 16개가 지원된다는 것을 알 수 있습니다. 각각의 레지스터가 어떤 값을 받아 들일지는 정해져 있지 않으며, 사용자가 외부에서 설계한 정점 구조체 정보에 따라 셰이더 코드를 작성하면서 정해주게 된다.

상수 레지스터는 종류별로 개수가 다르며, 그 값은 연산 도중에 ALU에 의해서 변경될 수 없다는 특징이 있다.

임시 레지스터는 연산 도중에 값을 읽고 써야하는 부분에서 사용하도록 설정되어 있는 레지스터다.

마지막으로 출력 레지스터는 oPos, oD0, oT0와 같이 기록되어야 하는 데이터의 종류가 레지스터마다 정해져 있으며, 버텍스 셰이더에서 계산된 결과값을 다음 단계인 Geometry Processing으로 전달해주는 기능을 담당하게 된다.

 

위의 그림에서 중요한 것은 ALU 와 각 레지스터간의 화살표의 방향이다.

입력 레지스터와 상수 레지스터의 경우 ALU에서는 레지스터 안에 들어있는 값을 읽어들여 사용할 수는 있지만 어떤 값을 ALU가 기록할 수는 없다. 반면 출력 레지스터의 경우 ALU는 결과값을 기록할수만 있고 기록한 값을 다시 읽어들여 사용할 수는 없다.

마지막으로 임시 레지스터의 경우 계산을 진행하는 동안 발생하는 중간 결과값을 기록할 수 있고, 그 값을 다시 읽어들여 다음 연산에 사용할 수 있다.

 

아래 그림은 버텍스 셰이더에서 간단한 연산을 처리할 때 레지스터를 사용하는 방법을 보여주고 있다. 이것은 단순한 예시이므로 사용자가 기능을 정의할 때는 위에서 설명된 많은 레지스터를 다양하게 활용할 수 있을 것이다.

(그림 5) register calc.ppt





6.     픽셀 셰이더와 레지스터

 

픽셀 셰이더의 경우도 버텍스 셰이더와 구조적으로 다르지 않다.

다만 3D 공간 데이터를 입력받아 2D 데이터를 출력해야 하는 버텍스 셰이더와는 달리 2D 픽셀 데이터를 입력받아 추가적인 처리를 하고, 2D 픽셀 형태로 출력해준다는 점만 차이가 있다.

따라서 셰이더의 기본 구조는 같으며, 입출력에 사용되는 레지스터의 종류만 차이가 있다는 점을 잘 알아야 할 것이다.

(그림 6) pixel shader arch.ppt

(자료 출처) 용준. 셰이더 프로그래밍

 


7.     HLSL과 레지스터

 

이렇게 살펴보니 셰이더 프로그래밍이라는 것은 레지스터를 이용해서 어셈블리어로 코딩을 해야하는 어려운 작업인 것처럼 보인다.

그렇다. HLSL이라는 셰이더 프로그래밍 언어가 등장하기 전까지는 이 작업은 상당히 번거롭고 계산이 어려운 작업이다그렇지만 최근에 HLSL이라는 고급 언어가 등장하면서 레지스터 할당이나 기능에 신경을 쓰지 않고도 작업을 할 수 있게 되어 매우 편리해 졌다.

다만 버전 별로 제공되는 레지스터의 개수와 기능의 차이를 알지 못하면, 프로그램은 실행될지 모르지만 계산량은 오히려 더 늘어나고 속도는 더 떨어질 수 있기 때문에 가장 기본이 되는 레지스터에 대해 확실히 알고 넘어가는 것은 꼭 필요한 일이라 할 수 있다.

 


Posted by Mister_Q