[Article] Zorua: A Holistic Approach to Resource Virtualization in GPUs (Micro 2016)

Zorua는 2016년 MICRO (홈페이지)에 발표된 논문이다. 논문을 읽고 내용을 정리해 보았다. Motivation Thread Block (Cooperative Thread Array, CTA)는 thread의 묶음을 의미한다. 하나의 thread block은 보통 수십 또는 수백 개의 thread를 포함한다. Thread block은 GPU의 SM에 스케줄링 되는 최소단위이다. 한 SM에 총 실행 가능한 thread block의 개수는 크게 아래의 3가지 이유로 결정된다. Thread의 register 사용량 (SM의 … Read more

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

지난번에 GPU의 메모리 종류에 대해서 정리를 하였다. Memory Coalescing에 대해서 작성을 하려고 하였으나 모르는 부분이 많아서 먼저 메모리 구조를 알아보았다. CUDA 코딩을 할 때 가장 중요한 부분이 memory coalescing이다. 실제로 성능에 큰 차이가 발생한다. 간단한 vector (x, y, z)를 access 하는 코드를 만들어서 성능 차이를 비교해보았는데 memory coalescing을 고려한 코드와 그렇지 않은 코드의 성능 차이가 … Read more

[Pascal Architecture] Compute Preemption (Pixel Level Preemption)

Pascal architecture부터는 instruction level execution preemption이 가능하다고 한다. 실제 이 기능은 상당히 만족스럽다. 기존 Kepler, Maxwell GPU를 사용할 때 CUDA 프로그램과 그래픽 연산을 동시에 사용하면 화면이 검은색으로 변하면서 CUDA 프로그램이 완료될 때 까지 아무것도 할 수 없는 상태로 변한다. 하지만 Pascal architecture부터는 2개를 동시에 사용해서 화면이 꺼지거나 하는 현상이 없어졌다. 그 이유가 instruction level execution … Read more

[NVIDIA GPU] Memory 종류

연구실 과제로 기존 C 코드로 구현된 프로그램을 CUDA를 사용하여 병렬화 작업 중이다. CUDA 코딩을 하다 보니 성능을 최적화하기 위해 고려해야 할 부분이 너무 많다는 것을 알게 되었다. 예를 들어 branch divergence, memory coalescing, shared memory 사용, 등의 문제가 대표적으로 고려해야 할 부분이다. 많은 다양한 부분을 고쳐 보았다. 그중 memory coalescing에 대한 부분을 수정한 후 가장 … Read more

[Interconnection] PCIe 성능

PCI Express (Peripheral Component Interconnect Express) 또는 PCIe는 point-to-point interconnection architecture이다. PCIe는 기존 PCI/PCI-X bus를 대체하기 위해 제안되었다. 컴퓨터 조립할때 GPU, SSD 등을 PCIe를 사용하여 CPU, host mempry등과 연결한다. 그림1은 PCIe, CPU, Memory가 root complex를 사용하여 연결한 그림이다. 그림 1: Root complex를 사용하여 PCIe, CPU, Memory가 연결된 그림 기존 PCI는 shared parallel bus architecture를 사용하였다고 … Read more

[Pascal Architecture] Unified Memory

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

[MPI + CUDA] An Introduction to CUDA-Aware MPI

Message Passing Interface (MPI) Message Passing Interface (MPI)는 distributed system에서 데이터 통신을 하기 위한 standard API이다. 주로 High Performance Computing (HPC) 시스템에서 사용된다. 현재 버전의 CUDA는 MPI와 호환이 가능하다고 한다.  MIP+CUDA를 사용하는 이유는 크게 아래와 같다. data size가 너무 커서 하나의 GPU로 실행이 불가능한 경우 (실행은 가능하나 시간이 오래 걸리는 경우) GPU를 사용하여 기존 MPI … Read more

[Pascal Architecture] NVLink (High Speed Interconnection)

NVLink는 NVIDIA사에서 소개한 high speed interconnection (NVHS: NVIDIA’s new High-Speed Signaling  interconnection)을 말한다. NVLink는 Tesla P100과 Pascal GP100 GPUs에서 지원한다. 가장 큰 목적은 GPU와 GPU 간의 data access 속도(대역폭)를 향상하려는 방법이다. NVLink를 지원하지 않을 경우 GPU 간에 data access를 하기 위해서는 PCIe를 사용하여 호스트(host)의 메모리에 저장 후 다시 PCIe를 사용하여 다른 GPU에 데이터 로딩을 진행한다. … Read more

[Pascal Architecture] Streaming Multiprocessor (SM) design (P100) (Part 2)

이전에 설명했듯이 GP 100의 SM은 총 6만(65,536) 개의 32-bit register와 64개의 CUDA core로 구성되어 있다. 이는 지난 Maxwell, Kepler와 같은 register 크기이지만 core의 개수는 줄어들었다. 결과적으로 하나의 코어에 할당된 register의 개수가 늘어난 형태이다. 아래 그림 1은 Pascal SM의 구조를 표현한 그림이고, 그림 2는 지난 3세대의 GPU 스펙을 정리한 표이다 (출처). 그림 1: Pascal SM 구조 … Read more

[Pascal Architecture] Streaming Multiprocessor (SM) design (P100)

지난 2016년 5월에 NVIDIA에서 Pascal architecture를 공개하였다. 지난 몇 개월간 개인적인 사정으로 Pascal 구조를 들여다볼 시간이 없었다. 하지만 나는 GTX 1060을 구매하여서 사용하고 있다. 오늘은 Pascal architecture의 Streaming Multiprocessors (SMs)의 구조를 정리해 볼 계획이다. 대부분 정보는 “NVIDIA Tesla P100 White Paper (출처)”에서 읽은 내용이다. Pascal SM은 지난 세대의 Kepler와 Maxwell SM (SMX or SMM)의 구조 … Read more