[NVIDIA GPU] Pinned Host Memory (CUDA)

연구실에서 기업과제로 CUDA를 사용하여 병렬화 코딩을 진행하고 있다. Multi-GPUs 관련 코딩을 하면서 Pinned Host Memory라는 부분을 알게 되어 짧게 정리하였다. 다양한 최적화 기법을 시도해 보았다. 그 중 Pinned Host Memory를 사용하여 상당한 성능 향상을 얻을 수 있었다. 보통 Host (CPU)에서 메모리 allocation(할당)을 하면 Pageable Memory이다. Pageable Memory의 경우 GPU 메모리로 바로 복사가 불가능하다고 한다. 우선 … Read more

[NVIDIA GPU] Mixed Precision Programming

Pascal GPU (and CUDA 8)에서 16bit FP (Floating Point)와 8/16bit INT (Integer) 연산이 가능해졌다. 많은 HPC (High-Performance Computing) 애플리케이션은 높은 정밀도 연산이 필요해서 32bit (FP32 or Single Float) 또는 64bit (FP64 or Double Float) FP연산을 사용한다. 제한적인 애플리케이션에서는 128bit 또는 256bit FP 연산을 사용하기도 한다. 하지만, 최근 쟁점이 되는 Machine Learning (Deep Neural Network) 연산의 … Read more

[Article] Review and Comparative Study of Ray Traversal Algorithms on A Modern GPU Architecture

본 논문은 WSCG 2014 (홈페이지)에서 공개된 논문이다. 현재 진행하고 있는 과제와 관련되어서 읽고 정리하였다. Motivation Ray tracing은 light(빛) 또는 wave(전파)의 진행방향을 파악하는 기술이다. Ray tracing은 보통 screen에 object를 출력 할 때 많이 사용된다. 빛의 시작점 (보통 태양) 등에서 light (ray)가 진행되는 방향을 파악하고 현재 보이는 screen에 총 도달하는 ray의 개수를 파악하여 밝기와 색상을 결정하는 방법이 … Read more

[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