Top Banner
INTRODUCTION TO GPU COMPUTING Ilya Kuzovkin 13 May 2014, Tartu
71

Introduction to Computing on GPU

May 06, 2015

Download

Technology

Ilya Kuzovkin

The presentation is given during the Computer Graphics seminar at the University of Tartu. It is an introductory overview of the GPGPU idea in general and gives "hello world" examples using old-school shader computing, OpenCL and CUDA. The code is available in my Github repository.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introduction to Computing on GPU

INTRODUCTION TO GPU COMPUTING

Ilya Kuzovkin

13 May 2014, Tartu

Page 2: Introduction to Computing on GPU

PART I “TEAPOT”

Page 3: Introduction to Computing on GPU

SIMPLE OPENGL PROGRAM

Idea of computing on GPU emerged because GPUs became very good at parallel computations.

Page 4: Introduction to Computing on GPU

SIMPLE OPENGL PROGRAM

Idea of computing on GPU emerged because GPUs became very good at parallel computations. !Let us start from observing an example of parallelism in a simple OpenGL application.

Page 5: Introduction to Computing on GPU

SIMPLE OPENGL PROGRAMYou will need CodeBlocksWindows, Linux or XCodeMac to run this example.

• Install CodeBlocks bundled with MinGW compiler from http://www.codeblocks.org/downloads/26

!• Download codebase from https://github.com/kuz/

Introduction-to-GPU-Computing !• Open the project from the code/Cube!!• Compile & run it

Page 6: Introduction to Computing on GPU

SHADER PROGRAM

Program which is executed on GPU. Has to be written using shading language. In OpenGL this language is GLSL, which is based on C.

http://www.opengl.org/wiki/Shader

Page 7: Introduction to Computing on GPU

SHADER PROGRAM

Program which is executed on GPU. Has to be written using shading language. In OpenGL this language is GLSL, which is based on C.

OpenGL has 5 main shader stages: • Vertex Shader • Tessellation Control • Geometry Shader • Fragment Shader • Compute Shader (since 4.3)

http://www.opengl.org/wiki/Shader

Page 8: Introduction to Computing on GPU

SHADER PROGRAM

Program which is executed on GPU. Has to be written using shading language. In OpenGL this language is GLSL, which is based on C.

OpenGL has 5 main shader stages: • Vertex Shader • Tessellation Control • Geometry Shader • Fragment Shader • Compute Shader (since 4.3)

http://www.opengl.org/wiki/Shader

Page 9: Introduction to Computing on GPU

LIGHTING

Is it a cube or not? We will find out as soon as we add lighting to the scene.

Page 10: Introduction to Computing on GPU

LIGHTING

Is it a cube or not? We will find out as soon as we add lighting to the scene.

https://github.com/konstantint/ComputerGraphics2013/blob/master/Lectures/07%20-%20Color%20and%20Lighting/slides07_colorandlighting.pdf

Page 11: Introduction to Computing on GPU

LIGHTING

Is it a cube or not? We will find out as soon as we add lighting to the scene.

https://github.com/konstantint/ComputerGraphics2013/blob/master/Lectures/07%20-%20Color%20and%20Lighting/slides07_colorandlighting.pdf

Exercise: code that equation into fragment shader of the Cube program

Page 12: Introduction to Computing on GPU

LIGHTING

Page 13: Introduction to Computing on GPU

• Run the program with lighting enabled and look at FPS values

COMPARE FPS

Page 14: Introduction to Computing on GPU

• Run the program with lighting enabled and look at FPS values

!• In cube.cpp idle() function uncomment dummy

code which simulates approximately same amount of computations as Phong lighting model requires.

COMPARE FPS

Page 15: Introduction to Computing on GPU

• Run the program with lighting enabled and look at FPS values

!• In cube.cpp idle() function uncomment dummy

code which simulates approximately same amount of computations as Phong lighting model requires.

!• Note that these computations are performed on CPU

COMPARE FPS

Page 16: Introduction to Computing on GPU

• Run the program with lighting enabled and look at FPS values

!• In cube.cpp idle() function uncomment dummy

code which simulates approximately same amount of computations as Phong lighting model requires.

!• Note that these computations are performed on CPU !• Observe how FPS has changed

COMPARE FPS

Page 17: Introduction to Computing on GPU

• Run the program with lighting enabled and look at FPS values

!• In cube.cpp idle() function uncomment dummy

code which simulates approximately same amount of computations as Phong lighting model requires.

!• Note that these computations are performed on CPU !• Observe how FPS has changed

Parallel computations are fast on GPU. Lets use it to compute something useful.

COMPARE FPS

Page 18: Introduction to Computing on GPU

PART II “OLD SCHOOL”

Page 19: Introduction to Computing on GPU

OPENGL PIPELINE + GLSL

http://www.opengl.org/wiki/Framebuffer

Take the input data from the CPU memory and put

it as an image into the GPU memory

Page 20: Introduction to Computing on GPU

http://www.opengl.org/wiki/Framebuffer

In the fragment shader perform a computation on each of the pixels of that

image

Take the input data from the CPU memory and put

it as an image into the GPU memory

OPENGL PIPELINE + GLSL

Page 21: Introduction to Computing on GPU

http://www.opengl.org/wiki/Framebuffer

In the fragment shader perform a computation on each of the pixels of that

image

Store the resulting image to the Render Buffer inside

the GPU memory

Take the input data from the CPU memory and put

it as an image into the GPU memory

OPENGL PIPELINE + GLSL

Page 22: Introduction to Computing on GPU

http://www.opengl.org/wiki/Framebuffer

Read output from the GPU memory back to the CPU

memory

Store the resulting image to the Render Buffer inside

the GPU memory

In the fragment shader perform a computation on each of the pixels of that

image

Take the input data from the CPU memory and put

it as an image into the GPU memory

OPENGL PIPELINE + GLSL

Page 23: Introduction to Computing on GPU

• Create texture where will store the input data

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 24: Introduction to Computing on GPU

• Create texture where will store the input data !!!!!• Create FrameBuffer Object (FBO) to “render” to

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 25: Introduction to Computing on GPU

• Run OpenGL pipeline

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 26: Introduction to Computing on GPU

• Run OpenGL pipeline • Render GL_QUADS of same size as the texture matrix

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 27: Introduction to Computing on GPU

• Run OpenGL pipeline • Render GL_QUADS of same size as the texture matrix • Use fragment shader to perform per-fragment

computations using data from the texture

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 28: Introduction to Computing on GPU

• Run OpenGL pipeline • Render GL_QUADS of same size as the texture matrix • Use fragment shader to perform per-fragment

computations using data from the texture • OpenGL will store result in the texture given to the

Render Buffer (within Framebuffer Object)

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 29: Introduction to Computing on GPU

• Run OpenGL pipeline • Render GL_QUADS of same size as the texture matrix • Use fragment shader to perform per-fragment

computations using data from the texture • OpenGL will store result in the texture given to the

Render Buffer (within Framebuffer Object) !• Read the data from the Render Buffer

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 30: Introduction to Computing on GPU

• Run OpenGL pipeline • Render GL_QUADS of same size as the texture matrix • Use fragment shader to perform per-fragment

computations using data from the texture • OpenGL will store result in the texture given to the

Render Buffer (within Framebuffer Object) !• Read the data from the Render Buffer !!!!• Can we use that to properly debug GLSL?

http://www.opengl.org/wiki/Framebuffer

OPENGL PIPELINE + GLSL

Page 31: Introduction to Computing on GPU

Run the project from the code/FBO

DEMO

Page 32: Introduction to Computing on GPU

PART III “MODERN TIMES”

Page 33: Introduction to Computing on GPU

COMPUTE SHADER• Since OpenGL 4.3 • Used to compute things not related to rendering directly

Page 34: Introduction to Computing on GPU

COMPUTE SHADER• Since OpenGL 4.3 • Used to compute things not related to rendering directly

Page 35: Introduction to Computing on GPU

COMPUTE SHADER

http://web.engr.oregonstate.edu/~mjb/cs557/Handouts/compute.shader.1pp.pdf

• Since OpenGL 4.3 • Used to compute things not related to rendering directly

Will not talk

about it

Page 36: Introduction to Computing on GPU

http://wiki.tiker.net/CudaVsOpenCL

Page 37: Introduction to Computing on GPU

Supported only by nVidia hardware

Supported by nVidia, AMD, Intel, Qualcomm

https://developer.nvidia.com/cuda-gpus http://www.khronos.org/conformance/adopters/conformant-products#opencl

http://wiki.tiker.net/CudaVsOpenCL

Page 38: Introduction to Computing on GPU

Supported only by nVidia hardware

Supported by nVidia, AMD, Intel, Qualcomm

https://developer.nvidia.com/cuda-gpus http://www.khronos.org/conformance/adopters/conformant-products#opencl

Implementations only by nVidia OpenCL

http://wiki.tiker.net/CudaVsOpenCL

Page 39: Introduction to Computing on GPU

Supported only by nVidia hardware

Supported by nVidia, AMD, Intel, Qualcomm

https://developer.nvidia.com/cuda-gpus http://www.khronos.org/conformance/adopters/conformant-products#opencl

Implementations only by nVidia OpenCL

http://wiki.tiker.net/CudaVsOpenCL

~same performance levels

Page 40: Introduction to Computing on GPU

Supported only by nVidia hardware

Supported by nVidia, AMD, Intel, Qualcomm

https://developer.nvidia.com/cuda-gpus http://www.khronos.org/conformance/adopters/conformant-products#opencl

Implementations only by nVidia OpenCL

http://wiki.tiker.net/CudaVsOpenCL

~same performance levels

Developer-friendly OpenCL

Page 41: Introduction to Computing on GPU

PART III CHAPTER 1

Page 42: Introduction to Computing on GPU
Page 43: Introduction to Computing on GPU
Page 44: Introduction to Computing on GPU
Page 45: Introduction to Computing on GPU
Page 46: Introduction to Computing on GPU
Page 47: Introduction to Computing on GPU

KERNEL

Page 48: Introduction to Computing on GPU

KERNEL

Page 49: Introduction to Computing on GPU

KERNEL

Page 50: Introduction to Computing on GPU

WRITE AND READ DATA ON GPU

Page 51: Introduction to Computing on GPU

WRITE AND READ DATA ON GPU

… run computations here …

Page 52: Introduction to Computing on GPU

WRITE AND READ DATA ON GPU

… run computations here …

Page 53: Introduction to Computing on GPU

THE COMPUTATION

Page 54: Introduction to Computing on GPU

THE COMPUTATION

Page 55: Introduction to Computing on GPU

THE COMPUTATION

Page 56: Introduction to Computing on GPU

THE COMPUTATION

Page 57: Introduction to Computing on GPU

THE COMPUTATION

Page 58: Introduction to Computing on GPU

DEMO

Open, study and run the project from the code/OpenCL

Page 59: Introduction to Computing on GPU

PART III CHAPTER 2

Page 60: Introduction to Computing on GPU

CUDA PROGRAMMING MODEL

• CPU is called “host” • Move data CPU <-> GPU memory cudaMemcopy • Allocate memory cudaMalloc  • Launch kernels on GPU

• GPU is called “device”

Page 61: Introduction to Computing on GPU

CUDA PROGRAMMING MODEL

• CPU is called “host” • Move data CPU <-> GPU memory cudaMemcopy • Allocate memory cudaMalloc  • Launch kernels on GPU

• GPU is called “device”

1. CPU allocates memory on GPU 2. CPU copies data to GPU memory 3. CPU launches kernels on GPU (process the data) 4. CPU copies results back to CPU memory

Typical CUDA program

Page 62: Introduction to Computing on GPU

CUDA PROGRAMMING MODEL

• CPU is called “host” • Move data CPU <-> GPU memory cudaMemcopy • Allocate memory cudaMalloc  • Launch kernels on GPU

• GPU is called “device”

1. CPU allocates memory on GPU 2. CPU copies data to GPU memory 3. CPU launches kernels on GPU (process the data) 4. CPU copies results back to CPU memory

Typical CUDA program

Very similar to the logic of OpenCL

Page 63: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 64: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 65: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 66: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 67: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 68: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 69: Introduction to Computing on GPU

EXAMPLE

Introduction to Parallel Programming @ Udacity https://www.udacity.com/course/cs344

Page 70: Introduction to Computing on GPU

PART IV “DISCUSSION”

Page 71: Introduction to Computing on GPU

LINKS• Code repository for this presentation

• https://github.com/kuz/Introduction-to-GPU-Computing • Feel free to leave feature requests there, ask questions, etc.

!• OpenCL tutorials & presentations

• http://streamcomputing.eu/knowledge/for-developers/tutorials/ • http://opencl.codeplex.com/wikipage?title=OpenCL%20Tutorials%20-%201&referringTitle=OpenCL%20Tutorials • http://www.cc.gatech.edu/~vetter/keeneland/tutorial-2011-04-14/06-intro_to_opencl.pdf

!• Introduction to Parallel Computing @ www.udacity.com

• https://www.udacity.com/course/cs344 !• Slides about Compute Shader

• http://web.engr.oregonstate.edu/~mjb/cs557/Handouts/compute.shader.1pp.pdf !• Introduction to Computer Graphics with codebases

• https://github.com/konstantint/ComputerGraphics2013 !• GLSL Computing (aka “Old school”)

• http://www.computer-graphics.se/gpu-computing/lab1.html