Computer Graphics

컴퓨터 그래픽스 GPU GPGPU

익플루 2014. 1. 15. 15:45
반응형

무식한 나를 위한 용어정리

 

 

컴퓨터 그래픽스

컴퓨터 그래픽스(Computer Graphics, CG, 문화어: 콤퓨터그라픽스, 콤퓨터화상처리) 컴퓨터를 이용해 실제 세계의 영상을 조작하거나 새로운 영상을 만들어내는 기술을 가리킨다. 최근에는 일반적으로 3차원 컴퓨터 그래픽스를 컴퓨터 그래픽스로 부르기도 한다.

컴퓨터 그래픽스에는 가상 세계에 구축된 모델로부터, 계산에 의해서, 씬을 시뮬레이션 하는 경우, 실세계의 화상 정보를 가공해 화상을 조작하는 경우, 화상과는 직접 관계가 없는 데이터 등을 가시화하는 경우가 있다.

모양과 색을 수치로 변화하여 디지털로 나타내는 논리적 표현 방법이다. 확대, 축소, 회전 등의 변환이 가능하고 색의 변경이 쉽고, 3차원 공간에서 자유자재로 이동하면서 다각도에서도 볼 수 있다. 광원의 위치에서 물체 각 면의 밝기를 나타낼 수 있고, 표면의 재질감과 투명감 등 다양하고 섬세한 묘사가 가능하다. 이렇듯 시간과 공간을 자유롭게 조작할 수 있다는 점이 강점이다.

 

 

GPU

그래픽 처리 장치( - 處理裝置) 또는 GPU(Graphics Processing Unit)는 컴퓨터 그래픽을 전문으로 담당하는 부품이다. 3D 그래픽을 주로 담당하며, 이와 관련된 연산을 할 때에 CPU의 부담을 크게 줄일 수 있다. 이러한 그래픽 처리 장치를 가지고 있는 카드를 그래픽 카드 또는 "비디오 카드"라고 한다.

맥 오에스 텐은 10.6부터 최초로 운영 체제 수준에서 GPU를 사용하기 시작했다.

그래픽 처리 장치는 부동 소수점 명령을 계산하는 그래픽 카드에 부착된 처리 장치이다. 그래픽 가속기는 그래픽 렌더링에 흔히 쓰이는 특별한 수학 명령을 포함하는 맞춤식 마이크로칩을 갖추고 있다. 이러한 마이크로칩이 효율적으로 동작하면 그래픽 가속기 또한 효율적으로 처리된다. 이들은 주로 3차원 게임이나 고사양 3차원 렌더링에 주로 쓰인다. 그래픽 처리 장치는 수많은 그래픽 기본 기하 명령을 담고 있어 호스트 CPU를 통해 화면에 표시하는 것보다 훨씬 더 빠르게 그리기를 처리할 수 있다.

초기 2차원 컴퓨터 그래픽스에 가장 흔히 쓰이는 명령들은 비트 블릿 명령, 또 RasterOp(블리터(blitter)라 불리는 특수한 하드웨어에 일반적으로 쓰임)를 사용하는 여러 개의 비트맵 패턴 혼합 명령이었는데, 이 명령들은 텍스처 매핑에 주로 사용되었다. 또한 사각형, 삼각형, 원형, 등의 도형을 그리는 명령도 포함하였다. 이후의 그래픽 처리 장치들은 3차원 컴퓨터 그래픽스의 처리를 지원하기 위해 도형의 회전, 평행이동, 좌표 변환 등의 기하학적 명령이 추가되었다.

최신 그래픽 처리 장치들은 픽셀 셰이더, 버텍스 셰이더, 수퍼샘플링, 색 공간 변환 등의 복잡하고 다양한 명령을 지원하며, 디지털 영상의 재생을 가속하는 기능도 포함하고 있다. 이 명령의 많은 부분은 개발자가 직접 다룰 수 있도록 프로그래밍 가능한 인터페이스를 가진다.

또한 그래픽 처리 장치는 대량의 행렬벡터를 다루는 데 뛰어난 성능을 발휘하므로, 이러한 연산을 많이 사용하는 응용 프로그램들은 그래픽 처리와 관련 없는 작업에도 그래픽 처리 하드웨어를 이용하기도 한다.

 

GPU 형태

  • 전용 그래픽 카드
  • 통합 그래픽 솔루션
  • 하이브리드 솔루션
  • 스팀 프로세싱
  • 일반 목적의 GPU
  • 내장 그래픽 [ iGPU (integrated GPU) ]

 

 

GPGPU

범용 GPU(General-Purpose computing on Graphics Processing Units, GPGPU)는 GPGP 또는 GP2 라고도 불리며, 컴퓨터 그래픽스를 위한 계산만 다루는 GPU를 사용하여 CPU가 전통적으로 취급했던 응용 프로그램들의 계산을 수행하는 기술이다. 이를 가능하게 한 것은 프로그램 가능한 층과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 스트림 프로세싱을 사용할 수 있게 된다.

 

1. GPGPU 프로그래밍 개념

GPU는 그래픽에 특화되어 설계되었으며 따라서 연산과 프로그래밍에 있어서 매우 제한적이다. 그 본성에 따라, GPU는 흐름 처리를 이용하여 풀 수 있는 문제에서만 효과적이며 그 하드웨어를 사용하는 방식은 정해져 있다.

1.1 흐름 처리

GPU는 독립적인 꼭지점들과 프래그먼트만 처리할 수 있지만 다수를 병렬로 처리할 수 있다. 이것은 특히 프로그래머가 같은 방식으로 많은 수의 꼭지점 또는 프래그먼트를 처리하고자 할 때 유용하다. 이런 의미에서, GPU는 흐름 프로세서이다. 즉, 병렬로 한번에 하나의 커널을 흐름 속의 많은 레코드에 실행시키는 것이다. 흐름이란 단순히 유사한 계산을 필요로 하는 레코드의 모음이다. 흐름으로 데이터 병렬성을 구할 수 있다. 커널이란 함수로써 흐름 속의 각 요소에 적용되는 것이다. GPU에서는 꼭지점과 프래그먼트가 흐름 속의 요소이고, 셰이더가 그 위에서 작동하는 커널이다. GPU가 요소들을 독립적으로 처리하므로 공유되는 또는 정적인 데이터는 없다. 단지 각 요소를 입력으로부터 읽고, 연산을 수행하고, 출력으로 쓸 뿐이다. 다양한 입력과 다양한 출력을 갖는 것은 허용되는 편이나 읽고 쓰기에 모두 사용되는 메모리는 없다. 산술 치열도는 전송되는 메모리 워드 당 연산으로 정의된다. 중요한 것은 GPGPU 응용 프로그램이 높은 산술치열도를 가지는 것으로 그렇지 않다면 메모리 접근 불확실성이 계산 속도를 제한할 것이다. 이상적인 GPGPU 응용 프로그램의 데이터 집합은 크고, 병렬도는 높고, 데이터 요소간 의존성은 최소이다.

1.2 GPU 프로그래밍 개념

1.2.1 계산 자원

GPU가 사용 가능한 계산 자원은 다양하다:

  • 프로그램 가능한 프로세서 – 꼭지점, 프리미티브, 프래그먼트 파이프라인으로 프로그래머는 데이터의 흐름에 커널을 배풀 수 있다.
  • 비트맵 변환기 – 프래그먼트를 만들고 꼭지점 당 상수-예를 들어 텍스처 좌표와 색상-를 내삽한다
  • 텍스처유닛 – 읽기 전용 메모리 계면
  • 프레임 버퍼 – 쓰기 전용 메모리 계면

사실, 프로그래머는 프레임 버퍼 대신 쓰기 전용 텍스처로 바꿔치기할 수도 있다. 이는 텍스처로 그리기 Render-To-Texture (RTT) 또는 백버퍼로 그린 후 텍스처로 베께기 Render-To-Backbuffer-Copy-To-Texture(RTBCTT) 아니면 더 최근의 흐름 출력으로 이루어진다.

1.2.2 흐름으로서의 텍스처

GPGPU에서 흐름이 취하는 가장 일반적인 형태는 2차원 격자이다. GPU안에 만들어져 있는 랜더링 모델에 알맞기 때문이다. 다수의 계산이 격자 형태로 변환될 수 있다: 행렬 계산, 이미지 처리, 물리 기반 시뮬레이션 등. 텍스처가 메모리로 사용되므로 텍스처 룩업은 메모리 읽기로 사용된다. 이 덕분으로 어떤 연산은 GPU에 의해 자동으로 이루어진다.

1.2.3 커널

커널은 반복문의 본체라고 생각할 수 있다. 예를 들어 만일 프로그래머가 CPU로 격자행렬을 다룬다면 그 코드는 다음과 비슷할 것이다:

// 입출력 격자는 각각 10000 x 10000를 가지고 있다. 
void transform_10k_by_10k_grid(float in[10000][10000], float out[10000][10000]) 
{
   for(int x = 0; x < 10000; x++)
   {
     for(int y = 0; y < 10000; y++)
     {       // 다음 행이 1억 번 실행된다.
       out[x][y] = do_some_hard_work( in[x][y] );
     }
   }
 }

GPU상에서 프로그래머가 지정하는 것은 반복문의 본체 부분 (커널이 된다) 과 반복문이 기하 처리할 데이터 뿐이다.

* 흐름 제어 (flow control)

순차 코드에서는 if-then-else문과 다양한 반복문으로 흐름을 제어하는 것이 가능하다. 최근에야 비로소 이러한 흐름 제어 구조가 GPU에 추가되었다.[3] 조건부 쓰기는 일련의 더 간단한 명령을 쓰는 것으로 이루어질 수 있었지만, 반복문이나 조건부 분기는 불가능했다. 최근의 GPU는 분기를 허용하지만, 보통 성능상 손실을 감수해야 한다. 분기를 일반적으로 안쪽 반복문에서는 피해야 하는 것은 CPU나 GPU나 마찬가지이고, 다양한 기술, 즉, 정적 분기 해소, 선계산, Z-cull[4]로 하드웨어 지원이 없을 때 분기할 수 있다.

1.3 GPU 기법

변환 (map)

변환 연산은 주어진 함수 (커널)을 스트림의 모든 요소에 적용한다. 간단한 예로 스트림의 모든 값에 어떤 상수를 곱하는 것이다. (밝기 조절) 변환 연산은 GPU상에서 간단히 구현된다. 프로그래머는 화면의 각 픽셀의 프래그먼트를 생성하고 각각에 프래그먼트 프로그램을 적용한다. 결과로 얻어지는 같은 크기의 스트림이 출력 버퍼에 저장된다.

감축

어떤 계산은 큰 흐름으로부터 작은 흐름(단 한개의 요소만 남을 수도 있다)을 계산해야 한다. 이를 흐름의 감축이라 부른다. 일반적으로 감축은 여러 단계로 이루어질 수 있다. 이전 단계의 결과가 이번 단계의 입력으로 사용되고, 연산이 적용되는 범위가 흐름 요소 하나만 남을 때 까지 반복된다.

흐름 필터링

흐름 필터링은 본질적으로 불균일 감축이다. 필터링은 어떤 기준에 따라 흐름에서 일부 요소를 제거하는 것이다.

흩뿌리기

흩뿌리기 연산은 꼭지점 처리에서 가장 자연스럽게 정의된다. 꼭지점 처리는 꼭지점의 위치를 조정할 수 있어서 프로그래머가 정보를 격자의 어디에 예치하는지 제어할 수 있게 해 준다. 다른 확장도 가능한데, 예를 들어 꼭지점이 영향을 미치는 영역의 크기를 제어하는 것이다. 프래그먼트 처리기는 직접 뿌리기 연산을 수행할 수 없는데, 그 까닭은 격자상에서 각 프래그먼트의 위치는 프래그먼트가 생성될 때 고정되어 프로그래머가 변경할 수 없기 때문이다. 그러나 논리적 흩뿌리기 연산은 추가적인 수집 단계로 때때로 재투사 또는 구현될 수 있다. 흩뿌리기를 구현하려면 먼저 출력값과 출력 주소 모두를 송출해야 한다. 그 직후의 수집 연산은 주소 비교를 통해 출력 값이 현재의 출력칸에 맞아떨어지는지 확인한다.

수집

프래그먼트 처리기는 텍스처를 임의 방식으로 읽을 수도 있어서 단수/복수의 어떤 격자 칸으로부터도 원하는 대로 정보를 모을 수 있다.

정렬

정렬 연산은 순서 없이 뒤섞인 요소 집합을 순서에 따라 정렬된 요소의 집합으로 변환한다. 가장 일반적인 GPU 구현은 정렬망을 이용하는 것이다.

탐색

탐색 연산으로 프로그래머는 흐름 안의 특정 요소 또는 특정 요소의 이웃 요소를 찾을 수 있다. GPU는 한 요소를 찾는 속도를 올리기 위해 사용되지는 않지만 대신 여러 탐색을 병렬로 실행하는 데 사용된다.

자료 구조

다양한 자료 구조가 GPU상에서 표현될 수 있다:

  • 고밀도 배열
  • 저밀도 배열 - 정적, 또는 동적
  • 적응 구조

기타

GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한개와 대등하지 않다.

 

출처 : 위키피디아(wikipedia)

반응형

'Computer Graphics' 카테고리의 다른 글

OpenCL이란  (0) 2014.01.22
CUDA란 CUDA 병렬 프로그래밍 CUDA 병렬 처리  (0) 2014.01.16
OpenGL 광원 조명 질감 설정  (0) 2014.01.14
쉐이딩(Shading) 셰이딩  (0) 2014.01.10
쉐이더(Shader) 셰이더  (0) 2014.01.10