Category Archives: GPU/GPGPU

MKBlog 관리자 입니다.
GPUs에 관련된 정보를 공유할 계획입니다.
개인적으로 공부를 하는 부분이라 잘 정리하도록 노력해보겠습니다.
감사합니다.

[GPU] Occlusion Culling (Early-Z vs. Occlusion Queries)

What is Occlusion Culling? (출처 1) 간단히 설명하면 필요 없는 Geometry(지형, 물체 등)를 그리지 않도록 불필요한 연산을 제거하는 기술이다. 보통 모니터에 보이는 화면에 벗어난 물체 또는 다른 물체에 의해서 가려지는 물체(Occlusion) 등에 대한 연산을 수행하지 않게 하여서 Rendering 성능을 향상하는 방법을 의미한다. Occlusion Culling은 크게 “Occlusion Query”와 “Early-Z” 방법을 사용하여서 필요 없는 Rendering 연산을 제거한다.… Read More »

[GPGPU Series 9] Memory Hierarchy on GPUs

GPU의 메모리 구조에 대해서 정리를 해보았다. 최근 GPU는 CPU와 비슷한 메모리 계층 구조를 가지고 있다.  GPGPU를 지원하는 초창기 GPU는 CPU와는 다소 다른 메모리 계층 구조를 가졌던 것으로 알려져 있다. 하지만 GPU를 General Purpose 연산 목적으로 많이 사용하면서 점차 CPU와 비슷한 메모리 계층 구조로 바뀌게 된 것 같다. 그림 1: CPU, GPU Memory 구조 (출처 1, 2)… Read More »

[GPU] Multiple Render Targets (MRT)

그림1: Multiple Render Target 예제 그림 최근(?) GPU는 대부분 Multiple Render Targets (MRT) 기능을 지원한다. MRT 기능을 간단히 설명하면 한 번의 Fragment Shader 연산을 수행하여 여러 개의 Texture (Render Target Textures)을 생성하는 방법을 의미한다. 그림1은 MRT 기능을 사용하는 Shader 연산 순서도이다. MRT는 OpenGL 2.0과 Direct3D 9 부터 지원한다고 한다 (출처 1). 보통 MRT를 기능을 사용하여… Read More »

[GPGPU Series 8] Branch Divergence

GPU는 Thread를 32 또는 64개씩 묶어서 하나의 같은 Instruction을 수행한다. Branch Divergence는 Warp에 속한 Thread가 서로 다른 연산을 수행해야 하는 경우 발생한다. 예를 들어 Warp에 속한 짝수 ID를 가진 Thread는 IF 문에 해당하는 코드를 실행해야 하고, 홀수 ID를 가진 Thread는 ELSE에 해당하는 코드를 실행해야 하는 경우 Branch Divergence가 발생한다. 아래 코드는 Thread ID의 홀수 짝수 여부를 확인하여… Read More »

[GPU] Forward Rendering vs. Deferred Rendering

예전에 FlexRendering에서 Deferred Rendering에 대해 작성한 적이 있다. FlexRendering에서 사용하는 Deferred Rendering은 Tile-based Rendering을 의미하는 것 같다. 하지만, 보통 Graphic 연산에서 Deferred Rendering은 다른 의미로 더 많이 사용되는 것 같다. 이 글에서 Forward Rendering과 Deferring Rendering에 대해서 작성하였다. 이 글은 출처 1의 내용을 기반으로 작성하였다. Forward Rendering Forward Rendering은 OpenGL등을 처음 배우게 되면 사용하는 Graphic… Read More »

[GPGPU Series 7] Warp Execution

지난 글에서 Thread Block (TB)에서 Warp를 생성하는 방법에 관해서 설명하였다. 이번 글에서는 Warp가 실행되는 방법(?)에 대한 설명이다. Warp는 GPU Instruction을 실행하는 가장 기본 단위이다. Warp의 모든 Thread는 하나의 같은 Instruction을 실행한다. 하지만, Warp의 각 Thread는 서로 다른 Data 값을 읽을 수 있다. 결과적으로 Warp의 각 Thread는 같은 Instruction을 다른 Data 값을 사용하여 연산을 수행한다고 생각하면… Read More »

[GPGPU Series 6] Thread Block to Warps

지난번 글에 Thread Block (TB) Scheduler가 TB를 Streaming Multiprocessor (SM)에 Scheduling하는 방법에 대해 설명했다. 간단히 다시 설명하면 TB는 Round-Robin방식으로 SM에 Scheduling 되고 총 Scheduling 가능한 TB의 개수는 크게 3가지 이유로 제한 된다. 이번글에서는 SM에 Scheduling된 TB를 Warp단위로 나누는 과정에 대해서 설명한다. Warp라는 개념은 GPU를 이해하는데 가장 중요한 부분이라고 생각한다. 앞 글에서 설명한 것과 같이 TB는… Read More »

[GPU] Anti-Aliasing (AA) (SSAA vs. MSAA)

Graphic 공부를 하면 Anti-Aliasing (AA) 이란 단어를 Texture 다음으로 많이 듣게 된다. AA란 Object의 Edge를 부드럽게 하는 작업이다. 인터넷을 찾아보면 다양한 기법이 있지만 크게 2가지 방법이 제일 유명하다. 하나는 Super-Sampling Anti-Aliasing (SSAA)이고, 다른 하나는 Multi-Sample Anti-Aliasing (MSAA)이다. MSAA와 SSAA기법을 사용하여 만든 Image 결과는 큰 차이가 없다. 출처 6에 SSAA와 MSAA 기법을 사용하여 생성한 Image를 확인… Read More »

[GPU] Texture Filtering (Bilinear vs. Trilinear vs. Anisotropic)

Graphics 관련 공부를 하면서 계속 새로운 것을 알게되고 정리해야 할 내용이 너무 많아지고 있다. 솔직히 이제는 새로운 정보에 대해서 제대로 이해하는지 걱정이 된다. Graphics 연산에 Texture는 정말 필수 요소이다. Object (Triangle)의 색상을 결정하는 과정에 Texture 이미지를 사용하게 된다. 쉽게 설명하면 Cube 물체가 있다고 생각하고 색종이로 Cube 물체를 감싸게 되면 Cube는 색종이 색을 가진 Cube 처럼… Read More »

[GPU] Life of Triangle – NVIDIA’s Logical Pipeline

개인적으로 GPU 공부를 하면서 GPGPU의 개념만 이해했다. 실제로 GPU에서 Graphics (Graphics Pipeline) 연산을 어떻게 수행하는지 거의 알지 못한다. 운이 좋게 GPGPU 공부를 하고 실제로 GPU를 많이 사용하는 곳에서 일하게 되면서 GPU 공부를 계속할 수 있게 되었다. 공부하면서 NVIDIA에서 제공하는 “Life of a Triangle”이라는 기사를 읽고 너무 좋은 자료인 것 같아서 정리를 해보았다. 중간중간 모르는 부분도… Read More »