본문 바로가기
2022-2/논문 아이디어

GPU에서 Coalesced가 의미하는 바가 무엇인가

by 이망고_ 2022. 5. 18.

https://mkblog.co.kr/nvidia-gpu-memory-coalescing-coalesced-memory-access/

 

[NVIDIA GPU] Memory Coalescing이란? (Coalesced Memory Access) – MKBlog

지난번에 GPU의 메모리 종류에 대해서 정리를 하였다. Memory Coalescing에 대해서 작성을 하려고 하였으나 모르는 부분이 많아서 먼저 메모리 구조를 알아보았다. CUDA 코딩을 할 때 가장 중요한 부분

mkblog.co.kr

GPU에서 Coalesced 가 의미하는 바가 무엇인가

 

를 공부하다가 진짜진짜 잘 정리해둔 블로그가 있어서 링크 걸어놓는다.

진짜 단계별로 일목요연하게 너무 잘 정리되어 있어서 몇 번 읽어보니 이해하는 데에 도움이 되었다

32개의 memory request 가 연속적인 memory address를 가지고 있으며 하나의 cache line을 access하는 경우를 coalesced memory access 라고 한다. 그림 1은 coalesced memory access의 예제를 보여준다. 그림과 같이 warp 의 모든 thread가 하나의 cachline을 access하며 memory access address가 연속적인 것을 볼 수 있다. 이 경우 warp의 모든 thread의 memory instruction을 하나로 합쳐져서 memory request 가 생성된다. warp 는 한 번의 memory access만으로 32개의 thread의 메모리  request를 모두 처리할 수 있다

그림 2는 그림 1과 다르데 warp의 thread가 access하는 memory request가 하나의 cache line에 들어있지 않은 경우이다(하지만, memory access address는 연속적이다). address가 연속적이긴 하지만, 하나의 cache line에 들어가지 않기 때문에 하나의 warp는 2번의 cache access가 필요하다. 이 경우 하나의 cache line이 아니라 2개의 cache line을 access해야 한다. 결과적으로 하나의 memory instruction을 처리하기 위해서는 총 2번의 memory request를 생성해야 한다. 최소 2개의 cache line을 읽어보는 동안 warp는 실행할 수 없을 수도 있다. 또한, 더 많이 생성된 memory request 처리를 위해서 더 많은 memory bandwidth를 사용해야 한다.

그림 3은 memory address가 연속적이지는 않짐나 하나의 cache line에 모든 address가 들어가는 경우이다. CUDA computer 2.0 이하의 경우 1개 이상의 memory request가 발생한다. 하지만 CUDA compute 2.0 이상에서는 위와 같은 예제도 하나의 memory address로 합쳐져서 한 번의 memory access만 필요하다. 

 

하나의 warp에서 여러번의 memory access가 발생하는 경우를 memory divergence라고 한다. 최악의 경우 하나의 memory instruction 처리를 위해서 총 32번의 memory request가 필요할 수도 있다. memory divergence를 최소화하고 CUDA 프로그램 성능을 높이기 위해서는 memory access pattern을 고려하여 CUDA 프로그램을 제작해야 한다~~