[Pascal Architecture] Unified Memory

Unified memory는 프로그램을 제작하는 프로그래머 입장에서는 아주 중요한 부분이다. Unified memory가 지원하지 않을 경우 같은 데이터를 CPU와 GPU에 동시에 저장해야 하는 경우가 있다. 그리고 Sparse memory access (random data access로 인해서 load 한 모든 데이터를 사용하지 않는 경우를 의미함)의 경우 많은 data를 loading하고 오직 적은 수의 random access만 발생하여 성능이 느려질 수 있다.

2009년에 (Fermi architecture) GPU의 unified memory 개념을 도입하였다고 한다. Shared memory, private local memory, global memory의 address 영역을 하나의 unified memory 형태로 만들었다.

2011년 CUDA4에서 Unified Virtual Addressing (UVA) 개념을 발표하였다. UVA 개념으로 zero copy 메모리 access가 가능해졌다고 한다. CPU의 메모리나, 다른 GPU의 메모리를 memory copy 없이 loading이 가능하다. 하지만 이 방법은 성능에 큰 이점이 있지는 않다고 한다. 복사하지 않더라고 데이터 access를 위해서는 PCIe를 거쳐서 loading을 하므로 성능에 큰 차이가 없다고 한다.

ns_attach_image_5601479792672650

그림 1: Unified Memory 코드 예제

CUDA6에서 Unified Memory 개념을 발표하였다. 하나의 pointer를 사용하여 CPU 또는 GPU의 메모리에 접근할 수 있다. CPU는 CPU의 메모리는 사용하는 것처럼 보이고 GPU는 GPU의 메모리를 사용하는 것처럼 보인다고 한다. 하지만, Unified memory의 크기는 GPU의 physical memory 크기를 넘지 못한다고 한다. 그리고 Unified Memory를 사용하기 위해서는 kernel 실행 이전에 synchronized operation이 필요하다. 그림 1는 CUDA6에서 Unified Memory를 사용하는 코드의 예제이다. CUDA4의 UVA개념과 크게 다르지 않은 것 같다.

이번 Pascal GP100에서는 기존 Unified Memory 개념에 몇 가지 feature를 추가하여서 성능향상이 발생한다고 한다.

  1. support for large address spaces
  2. page faulting capability
  3. OS allocator

Pascal GP100의 경우 총 49-bit virtual address를 지원한다. 이 경우 기존 CPU의 48-bit address의 주소 영역과 모든 GPU memory를 연결하여 하나의 memory처럼 사용할 수 있다고 한다. (48 bits: 281,474,976,710,656) (49 bits: 316,912,650,057,057,350,374,175,801,344) 한 비트의 차이가 상당하다. 아래 그림 2는 Unified Memory의 개념을 정리한 그림이다.

ns_attach_image_5831479792996728

그림 2: Unified Memory 개념

다음은 page faulting을 지원한다는 점에서 큰 이득이 있다. 앞에서 언급하였듯이 CUDA 6의 Unified Memory를 사용하기 위해서는 synchronization operation이 필요하다. 하지만 page faulting을 지원할 경우 synchronization operation이 필요 없다고 한다. page fault가 발생하면, 데이터를 자동으로 GPU 메모리로 로딩하게 된다. 또한, CPU와 GPU가 하나의 메모리인 것처럼 착각을 하고 있어서 CPU가 GPU의 메모리를 또는 GPU가 CPU 메모리에 접근할 수 있다고 한다. 이와 더불어 global memory coherency를 지원한다. 결과적으로 프로그래머가 더는 synchronization 작업을 신경 쓸 필요가 없다.

ns_attach_image_6071479793538771

그림 3: Pascal의 Unified Memory를 사용한 코드 예제 

다음으로 operation system platform을 지원하여 OS allocator (malloc, new 등)을 사용하여 CPU 또는 GPU의 memory allocation이 가능하다. 더는 cudaMalloc, cudaFree같은 함수 사용이 필요 없어진다. 그림 3이 Pascal의 Unified Memory를 사용하였을 경우의 코드 예제이다.

마지막으로 Unified Memory의 장점을 정리하였다.
  1. 프로그래머 입장에서 CUDA 코딩이 수월해졌다. 메모리 복사에 대한 부담이 프로그래머 입장에서 하드웨어로 넘어가서 CUDA 프로그램을 제작하기 수월해졌다.
  2. 시스템 메모리보다 더 큰 용량의 data set을 실행할 수 있다. 49-bit address space를 지원하여 더 큰 data set 연산이 가능하다 (48 bits도 충분히 큰 것 같은데…).
  3. Sparse data access와 같이 random 적으로 데이터 access를 하는 경우 필요한 데이터만 로딩하기 때문에 성능에 이점이 발생할 수도 있다. 그리고 프로그래머 입장에서 어느 데이터가 필요한지 예측하여 프로그램을 제작할 필요가 없다.
출처
  1. https://devblogs.nvidia.com/parallelforall/introduction-cuda-aware-mpi/
  2. https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf

Leave a Comment