L17: CUDA, cont. 11/3/10. Final Project Purpose: October 28, Next Wednesday, November 3. Example Projects

Similar documents
L14: CUDA, cont. Execution Model and Memory Hierarchy"

Programming in CUDA. Malik M Khan

L18: Introduction to CUDA

1/26/09. Administrative. L4: Hardware Execution Model and Overview. Recall Execution Model. Outline. First assignment out, due Friday at 5PM

1/25/12. Administrative

1/19/11. Administrative. L2: Hardware Execution Model and Overview. What is an Execution Model? Parallel programming model. Outline.

2/2/11. Administrative. L6: Memory Hierarchy Optimization IV, Bandwidth Optimization. Project Proposal (due 3/9) Faculty Project Suggestions

L3: Data Partitioning and Memory Organization, Synchronization

Administrative. L8: Writing Correct Programs, cont. and Control Flow. Questions/comments from previous lectures. Outline 2/10/11

Introduction to CUDA (1 of n*)

2/17/10. Administrative. L7: Memory Hierarchy Optimization IV, Bandwidth Optimization and Case Studies. Administrative, cont.

Warps and Reduction Algorithms

Spring Prof. Hyesoon Kim

Tesla Architecture, CUDA and Optimization Strategies

GPU Fundamentals Jeff Larkin November 14, 2016

CUDA Lecture 2. Manfred Liebmann. Technische Universität München Chair of Optimal Control Center for Mathematical Sciences, M17

CS 179: GPU Computing LECTURE 4: GPU MEMORY SYSTEMS

Lecture 6. Programming with Message Passing Message Passing Interface (MPI)

Mattan Erez. The University of Texas at Austin

Introduction to CUDA Programming

CS4230 Parallel Programming. Lecture 3: Introduction to Parallel Architectures 8/28/12. Homework 1: Parallel Programming Basics

CS 179 Lecture 4. GPU Compute Architecture

CUDA Memory Model. Monday, 21 February Some material David Kirk, NVIDIA and Wen-mei W. Hwu, (used with permission)

Lecture 15: Introduction to GPU programming. Lecture 15: Introduction to GPU programming p. 1

CUDA. Schedule API. Language extensions. nvcc. Function type qualifiers (1) CUDA compiler to handle the standard C extensions.

CUDA programming model. N. Cardoso & P. Bicudo. Física Computacional (FC5)

ME964 High Performance Computing for Engineering Applications

Lecture 2: CUDA Programming

CUDA Performance Considerations (2 of 2)

Lecture 5. Performance Programming with CUDA

CSE 160 Lecture 24. Graphical Processing Units

Introduction to GPU hardware and to CUDA

Parallel Programming Principle and Practice. Lecture 9 Introduction to GPGPUs and CUDA Programming Model

CS4961 Parallel Programming. Lecture 3: Introduction to Parallel Architectures 8/30/11. Administrative UPDATE. Mary Hall August 30, 2011

GPU Programming. Performance Considerations. Miaoqing Huang University of Arkansas Fall / 60

This is a draft chapter from an upcoming CUDA textbook by David Kirk from NVIDIA and Prof. Wen-mei Hwu from UIUC.

Introduction to GPU programming. Introduction to GPU programming p. 1/17

CUDA Optimization with NVIDIA Nsight Visual Studio Edition 3.0. Julien Demouth, NVIDIA

Introduction to CUDA (1 of n*)

Fundamental CUDA Optimization. NVIDIA Corporation

Introduction to CUDA Algoritmi e Calcolo Parallelo. Daniele Loiacono

Numerical Simulation on the GPU

Data Parallel Execution Model

CE 431 Parallel Computer Architecture Spring Graphics Processor Units (GPU) Architecture

Fundamental CUDA Optimization. NVIDIA Corporation

CS4961 Parallel Programming. Lecture 18: Introduction to Message Passing 11/3/10. Final Project Purpose: Mary Hall November 2, 2010.

CUDA and GPU Performance Tuning Fundamentals: A hands-on introduction. Francesco Rossi University of Bologna and INFN

Lecture 7. Overlap Using Shared Memory Performance programming the memory hierarchy

Convolution Soup: A case study in CUDA optimization. The Fairmont San Jose 10:30 AM Friday October 2, 2009 Joe Stam

CUDA Architecture & Programming Model

ME964 High Performance Computing for Engineering Applications

CUDA PROGRAMMING MODEL Chaithanya Gadiyam Swapnil S Jadhav

CUDA Optimizations WS Intelligent Robotics Seminar. Universität Hamburg WS Intelligent Robotics Seminar Praveen Kulkarni

Kernel optimizations Launch configuration Global memory throughput Shared memory access Instruction throughput / control flow

CUDA Performance Optimization. Patrick Legresley

EE382N (20): Computer Architecture - Parallelism and Locality Fall 2011 Lecture 18 GPUs (III)

Slide credit: Slides adapted from David Kirk/NVIDIA and Wen-mei W. Hwu, DRAM Bandwidth

Reductions and Low-Level Performance Considerations CME343 / ME May David Tarjan NVIDIA Research

GPU programming. Dr. Bernhard Kainz

Master Informatics Eng.

Exotic Methods in Parallel Computing [GPU Computing]

B. Tech. Project Second Stage Report on

Lecture 7. Using Shared Memory Performance programming and the memory hierarchy

Introduction to CUDA Algoritmi e Calcolo Parallelo. Daniele Loiacono

Fundamental Optimizations

DATA-LEVEL PARALLELISM IN VECTOR, SIMD ANDGPU ARCHITECTURES(PART 2)

Supercomputing, Tutorial S03 New Orleans, Nov 14, 2010

CUDA OPTIMIZATIONS ISC 2011 Tutorial

Performance optimization with CUDA Algoritmi e Calcolo Parallelo. Daniele Loiacono

NVIDIA GTX200: TeraFLOPS Visual Computing. August 26, 2008 John Tynefield

GPU Computing: Development and Analysis. Part 1. Anton Wijs Muhammad Osama. Marieke Huisman Sebastiaan Joosten

NVIDIA GPU CODING & COMPUTING

Computer Architecture

COSC 6385 Computer Architecture. - Data Level Parallelism (II)

Review for Midterm 3/28/11. Administrative. Parts of Exam. Midterm Exam Monday, April 4. Midterm. Design Review. Final projects

Programmer's View of Execution Teminology Summary

CS 179: GPU Computing. Recitation 2: Synchronization, Shared memory, Matrix Transpose

Parallel Programming Concepts. GPU Computing with OpenCL

Module 3: CUDA Execution Model -I. Objective

CUDA Programming Model

CS8803SC Software and Hardware Cooperative Computing GPGPU. Prof. Hyesoon Kim School of Computer Science Georgia Institute of Technology

Parallel Numerical Algorithms

Overview: Graphics Processing Units

Global Memory Access Pattern and Control Flow

Dense Linear Algebra. HPC - Algorithms and Applications

1/31/11. How to tell if results are correct. Assignment 2: Analyzing the Results. Targets of Memory Hierarchy Optimizations. Overview of Lecture

Optimization Strategies Global Memory Access Pattern and Control Flow

Lecture 5. Performance programming for stencil methods Vectorization Computing with GPUs

Threading Hardware in G80

GPU Profiling and Optimization. Scott Grauer-Gray

CS 61C: Great Ideas in Computer Architecture (Machine Structures) Lecture 30: GP-GPU Programming. Lecturer: Alan Christopher

Introduction to GPGPU and GPU-architectures

Josef Pelikán, Jan Horáček CGG MFF UK Praha

Portland State University ECE 588/688. Graphics Processors

Convolution Soup: A case study in CUDA optimization. The Fairmont San Jose Joe Stam

Overview. Lecture 1: an introduction to CUDA. Hardware view. Hardware view. hardware view software view CUDA programming

GPU & High Performance Computing (by NVIDIA) CUDA. Compute Unified Device Architecture Florian Schornbaum

Fundamental Optimizations in CUDA Peng Wang, Developer Technology, NVIDIA

Benchmarking the Memory Hierarchy of Modern GPUs

Device Memories and Matrix Multiplication

Transcription:

L17: CUDA, cont. October 28, 2010 Final Project Purpose: - A chance to dig in deeper into a parallel programming model and explore concepts. - Present results to work on communication of technical ideas Write a non-trivial parallel program that combines two parallel programming languages/models. In some cases, just do two separate implementations. - OpenMP + SSE-3 - OpenMP + CUDA (but need to do this in separate parts of the code) - MPI + OpenMP - MPI + SSE-3 - MPI + CUDA Present results in a poster session on the last day of class 11/05/09 CS4961 Example Projects Look in the textbook or on-line - Recall Red/Blue from Ch. 4 - Implement in MPI (+ SSE-3) - Implement main computation in CUDA - Algorithms from Ch. 5 - SOR from Ch. 7 - CUDA implementation? - FFT from Ch. 10 - Jacobi from Ch. 10 - Graph algorithms - Image and signal processing algorithms - Other domains Next Wednesday, November 3 Use handin program on CADE machines handin cs4961 pdesc <file, ascii or PDF ok> Projects can be individual or group efforts, with 1 to three students per project. Turn in <1 page project proposal - Algorithm to be implemented - Programming model(s) - Implementation plan - Validation and measurement plan 11/05/09 CS4961 CS4961 4 1

From L1: The fastest computer in the world today What is its name? Jaguar (Cray XT5) From L1: The 2 nd fastest computer in the world What is its name? Jaguar (Cray XT5) Where is it located? Oak Ridge National Laboratory Where is it located? Oak Ridge National Laboratory How many processors does it have? ~37,000 processor chips (224,162 cores) How many processors does it have? ~37,000 processor chips (224,162 cores) What kind of processors? AMD 6-core Opterons What kind of processors? AMD 6-core Opterons How fast is it? 1.759 Petaflop/second One quadrillion operations/s 1 x 10 16 How fast is it? 1.759 Petaflop/second One quadrillion operations/s 1 x 10 16 See http://www.top500.org 08/25/2009 CS4961 5 See http://www.top500.org 08/25/2009 CS4961 6 Breaking news:the fastest computer in the world What is its name? Where is it located? How many processors does it have? What kind of processors? How fast is it? Tianhe-1A National Supercomputer Center in Tianjin ~21,000 processor chips (14,000 CPUs and 7,000 Tesla Fermis) CPU? NVIDIA Fermi 2.507 Petaflop/second 2.5 quadrillion operations/s See http://www.top500.org 1 x 10 16 08/25/2009 CS4961 7 Outline Reminder of CUDA Architecture Execution Model - Brief mention of control flow Heterogeneous Memory Hierarchy - Locality through data placement - Maximizing bandwidth through global memory coalescing - Avoiding memory bank conflicts Tiling and its Applicability to CUDA Code Generation This lecture includes slides provided by: Wen-mei Hwu (UIUC) and David Kirk (NVIDIA) see http://courses.ece.uiuc.edu/ece498/al1/ and Austin Robison (NVIDIA) 11/05/09 2

Reading David Kirk and Wen-mei Hwu manuscript (in progress) - http://www.toodoc.com/cuda-textbook-by-david-kirkfrom-nvidia-and-prof-wen-mei-hwu-pdf.html CUDA 2.x Manual, particularly Chapters 2 and 4 (download from nvidia.com/cudazone) Nice series from Dr. Dobbs Journal by Rob Farber - http://www.ddj.com/cpp/207200659 Hardware Implementation: A Set of SIMD Multiprocessors A device has a set of multiprocessors Each multiprocessor is a set of 32-bit processors with a Single Multiple Data architecture - Shared instruction unit At each clock cycle, a multiprocessor executes the same instruction on a group of threads called a warp The number of threads in a warp is the warp size 11/05/09 David Kirk/NVIDIA and Wen-mei W. Hwu, 2007 Device Multiprocessor N Multiprocessor 2 Multiprocessor 1 Processor 1 Processor 2 Processor M Hardware Execution Model Example SIMD Execution I. SIMD Execution of warpsize=m threads (from single block) Result is a set of instruction streams roughly equal to # blocks in thread divided by warpsize II. Multithreaded Execution across different instruction streams within block Also possibly across different blocks if there are more blocks than SMs III. Each block mapped to single SM No direct interaction across SMs Device Mul*processor N Mul*processor 2 Mul*processor 1 Shared isters isters Processor 1 Processor 2 Device memory isters Processor M Instruc*on Constant Cache Texture Cache Count 3 kernel function d_out[threadidx.x] = 0; for (int i=0; i<size/blocksize; i++) { int val = d_in[i*blocksize + threadidx.x]; d_out[threadidx.x] += compare(val, 3); P! P M-1 3

Example SIMD Execution Count 3 kernel function d_out[threadidx.x] = 0; for (int i=0; i<size/blocksize; i++) { int val = d_in[i*blocksize + threadidx.x]; d_out[threadidx.x] += compare(val, 3); Each core initializes data from addr based on its own threadidx threadidx threadidx threadidx + + P! + P M-1 &dout &dout &dout LDC 0, &(dout+ threadidx) Example SIMD Execution Count 3 kernel function d_out[threadidx.x] = 0; for (int i=0; i<size/blocksize; i++) { int val = d_in[i*blocksize + threadidx.x]; d_out[threadidx.x] += compare(val, 3); Each core initializes its own R3 0 0 0 P! P M-1 /* int i=0; */ LDC 0, R3 Example SIMD Execution Count 3 kernel function d_out[threadidx.x] = 0; for (int i=0; i<size/blocksize; i++) { int val = d_in[i*blocksize + threadidx.x]; d_out[threadidx.x] += compare(val, 3); Each core performs same operations from its own registers Etc. /* i*blocksize + threadidx */ P! P M-1 LDC BLOCKSIZE,R2 MUL R1, R3, R2 ADD R4, R1, RO time SM Warp Scheduling SM multithreaded Warp scheduler warp 8 instruction 11 warp 1 instruction 42 warp 3 instruction 95. warp 8 instruction 12 warp 3 instruction 96 David Kirk/NVIDIA and Wen-mei W. Hwu, 2007 SM hardware implements zerooverhead Warp scheduling Warps whose next instruction has its operands ready for consumption are eligible for execution Eligible Warps are selected for execution on a prioritized scheduling policy All threads in a Warp execute the same instruction when selected 4 clock cycles needed to dispatch the same instruction for all threads in a Warp in G80 If one global memory access is needed for every 4 instructions A minimal of 13 Warps are needed to fully tolerate 200-cycle memory latency 4

SIMD Execution of Control Flow Control flow example if (threadidx >= 2) { out[threadidx] += 100; else { out[threadidx] += 10; Re g Re g P! P M-1 Re g Instructio n compare threadidx,2 SIMD Execution of Control Flow Control flow example if (threadidx.x >= 2) { out[threadidx.x] += 100; else { out[threadidx.x] += 10; X X Re Re Re g g g P! P M-1 Instructio n /* possibly predicated using CC */ (CC) LD R5, &(out+threadidx.x) (CC) ADD R5, R5, 100 (CC) ST R5, &(out+threadidx.x) SIMD Execution of Control Flow Control flow example if (threadidx >= 2) { out[threadidx] += 100; else { out[threadidx] += 10; X X Re Re Re g g g P! P M-1 Instructio n /* possibly predicated using CC */ (not CC) LD R5, &(out+threadidx) (not CC) ADD R5, R5, 10 (not CC) ST R5, &(out+threadidx) A Very Simple Execution Model No branch prediction - Just evaluate branch targets and wait for resolution - But wait is only a small number of cycles No speculation - Only execute useful instructions 5

Terminology Divergent paths - Different threads within a warp take different control flow paths within a kernel function - N divergent paths in a warp? - An N-way divergent warp is serially issued over the N different paths using a hardware stack and per-thread predication logic to only write back results from the threads taking each divergent path. - Performance decreases by about a factor of N Hardware Implementation: Memory Architecture The local, global, constant, and texture spaces are regions of device memory Each multiprocessor has: - A set of 32-bit registers per processor - On-chip shared memory - Where the shared memory space resides - A read-only constant cache - To speed up access to the constant memory space - A read-only texture cache - To speed up access to the texture memory space Device Multiprocessor N Multiprocessor 2 Multiprocessor 1 isters Processor 1 Device memory Shared Memory isters Processor 2 isters Processor M Constant Cache Texture Cache Global, constant, texture memories David Kirk/NVIDIA and Wen-mei W. Hwu, 2007 Programmer s View: Memory Spaces Each thread can: - Read/write per-thread registers - Read/write per-thread local memory - Read/write per-block shared memory - Read/write per-grid global memory - Read only per-grid constant memory - Read only per-grid texture memory The host can read/write global, constant, and texture memory Host David Kirk/NVIDIA and Wen-mei W. Hwu, 2007 Grid Block (0, 0) isters Local Memory Global Memory Constant Memory Texture Memory Shared Memory Thread (0, 0) isters Thread (1, 0) Local Memory Block (1, 0) Shared Memory isters isters Thread (0, 0) Thread (1, 0) Local Local Memory Memory Constant Memory Example Signal recognition: - Apply input signal (a vector) to a set of precomputed transform matrices - Compute M 1 V, M 2 V,, M n V constant float d_signalvector[m]; device float R[N][M]; host void outerapplysignal () { float *h_inputsignal; dim3 dimgrid(n); dim3 dimblock(m); cudamemcpytosymbol (d_signalvector, h_inputsignal, M*sizeof(float)); ApplySignal<<<dimGrid,dimBlock>>>(M); global void ApplySignal (int M) { float result = 0.0; /* register */ for (j=0; j<m; j++) result += d_m[blockidx.x][threadidx.x][j] * d_signalvector[j]; R[blockIdx.x][threadIdx.x] = result; 6

Additional Detail Suppose each thread accesses different data from constant memory on same instruction - Reuse across threads? - Consider capacity of constant cache and locality - Code transformation needed? (later in lecture) - Cache latency proportional to number of accesses in a warp - No reuse? - Should not be in constant memory. Now Let s Look at Shared Memory Common Programming Pattern (5.1.2 of CUDA manual) - Load data into shared memory - Synchronize (if necessary) - Operate on data in shared memory - Synchronize (if necessary) - Write intermediate results to global memory - Repeat until done Shared memory Global memory CS6963 25 L6: Memory Hierarchy I Familiar concept? Mechanics of Using Shared Memory shared type qualifier required Must be allocated from global/device function, or as extern Examples: extern shared float d_s_array[]; /* a form of dynamic allocation */ /* MEMSIZE is size of per-block */ /* shared memory*/ host void outercompute() { compute<<<gs,bs,memsize>>>(); global void compute() { d_s_array[i] = ; global void compute2() { shared float d_s_array[m]; /* create or copy from global memory */ d_s_array[j] = ; /* write result back to global memory */ d_g_array[j] = d_s_array[j]; Bandwidth to Shared Memory: Parallel Memory Accesses Consider each thread accessing a different location in shared memory Bandwidth maximized if each one is able to proceed in parallel Hardware to support this - Banked memory: each bank can support an access on every memory cycle 7

Bank Addressing Examples Bank Addressing Examples No Bank Conflicts - Linear addressing stride == 1 No Bank Conflicts - Random 1:1 Permutation 2-way Bank Conflicts - Linear addressing stride == 2 8-way Bank Conflicts - Linear addressing stride == 8 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 15 Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 Bank 5 Bank 6 Bank 7 Bank 15 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 15 Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 Bank 5 Bank 6 Bank 7 Bank 15 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 8 Thread 9 Thread 10 Thread 11 Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 Bank 5 Bank 6 Bank 7 Bank 15 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 15 x8 x8 Bank 0 Bank 1 Bank 2 Bank 7 Bank 8 Bank 9 Bank 15 David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009 David Kirk/NVIDIA and Wen-mei W. Hwu, 302007-2009 How addresses map to banks on G80 Each bank has a bandwidth of 32 bits per clock cycle Successive 32-bit words are assigned to successive banks G80 has 16 banks - So bank = address % 16 - Same as the size of a half-warp - No bank conflicts between different half-warps, only within a single half-warp David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009 Shared memory bank conflicts Shared memory is as fast as registers if there are no bank conflicts The fast case: - If all threads of a half-warp access different banks, there is no bank conflict - If all threads of a half-warp access the identical address, there is no bank conflict (broadcast) The slow case: - Bank Conflict: multiple threads in the same half-warp access the same bank - Must serialize the accesses - Cost = max # of simultaneous accesses to a single bank David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009 8

Global Memory Accesses Understanding Global Memory Accesses Each thread issues memory accesses to data types of varying sizes, perhaps as small as 1 byte entities Given an address to load or store, memory returns/ updates segments of either 32 bytes, 64 bytes or 128 bytes Maximizing bandwidth: - Operate on an entire 128 byte segment for each memory transfer Memory protocol for compute capability 1.2* (CUDA Manual 5.1.2.1) Start with memory request by smallest numbered thread. Find the memory segment that contains the address (32, 64 or 128 byte segment, depending on data type) Find other active threads requesting addresses within that segment and coalesce Reduce transaction size if possible Access memory and mark threads as inactive Repeat until all threads in half-warp are serviced *Includes Tesla and GTX platforms Memory Layout of a Matrix in C Memory Layout of a Matrix in C Access direction in Kernel code M 0,0 M 0,1 M 1,0 M 1,1 M 2,0 M 3,0 M 2,1 M 3,1 M 0,2 M 1,2 M 2,2 M 3,2 Access direction in Kernel code M 0,0 M 0,1 M 1,0 M 1,1 M 2,0 M 3,0 M 2,1 M 3,1 M 0,2 M 1,2 M 2,2 M 3,2 M 0,3 M 1,3 M 2,3 M 3,3 M 0,3 M 1,3 M 2,3 M 3,3 Time Period 2 T 1 T 2 T 3 T 4 Time Period 1 Time Period 2 Time Period 1 T 1 T 2 T 3 T 4 T 1 T 2 T 3 T 4 T 1 T 2 T 3 T 4 M M M 0,0 M 1,0 M 2,0 M 3,0 M 0,1 M 1,1 M 2,1 M 3,1 M 0,2 M 1,2 M 2,2 M 3,2 M 0,3 M 1,3 M 2,3 M 3,3 David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009 M 0,0 M 1,0 M 2,0 M 3,0 M 0,1 M 1,1 M 2,1 M 3,1 M 0,2 M 1,2 M 2,2 M 3,2 M 0,3 M 1,3 M 2,3 M 3,3 David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009 9

Summary of Lecture A deeper probe of performance issues - Execution model - Control flow - Heterogeneous memory hierarchy - Locality and bandwidth - Tiling for CUDA code generation 10