[GPU] Mali Valhall Architecture (Mobile GPU)

Previous GPU Architecture (Bifrost GPU) 지난 5월(2019년)에 Mali의 새로운 GPU Architecture Valhall이 공개되었다. 지난 Bifrost 대비 많은 변화가 있었다고 한다. 우선 지난 Bifrost에 대해서 짧게 정리하였다. Bifrost는 지난 2016년에 처음 공개되어서 그림 1과 같이 Mali-G71, Mali-G72, Mali-G76 순서대로 총 3세대(High-Tier GPU 기준)에 걸쳐서 제품으로 출시되었다. Bifrost는 ARM GPU 중 최초로 Scalar GPU 구조로 되어 있다. … Read more

[GPU] Coordinate System (좌표 변환 순서)

Graphic API를 사용해서 이미지를 Rendering 하면 여러 연산 과정을 거치게 된다. 그중 Vertex Shader 연산은 물체(Object)의 좌표값을 계산하는 작업을 수행한다. 좌표 계산을 위해서 여러 번의 Transform(변환) 연산을 수행한다. 이번 글에서는 좌표의 변환 순서에 대해서 정리할 예정이다. MK: 예전에는 Vertex 연산 과정에서 Light 등을 고려해서 색상을 결정하는 연산도 같이 수행하였다고 한다. 그래서 Vertex Shader 라는 이름이 … Read more

[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