OpenCL. Sources Patrick Cozzi Spring 2011 NVIDIA CUDA Programming Guide CUDA by Example Programming Massively Parallel Processors.

Slides:



Advertisements
Similar presentations
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408/CS483, University of Illinois, Urbana-Champaign 1 ECE408 / CS483 Applied Parallel Programming.
Advertisements

Intermediate GPGPU Programming in CUDA
GPU programming: CUDA Acknowledgement: the lecture materials are based on the materials in NVIDIA teaching center CUDA course materials, including materials.
OpenCL Peter Holvenstot. OpenCL Designed as an API and language specification Standards maintained by the Khronos group  Currently 1.0, 1.1, and 1.2.
Programming with CUDA, WS09 Waqar Saleem, Jens Müller Programming with CUDA and Parallel Algorithms Waqar Saleem Jens Müller.
Basic CUDA Programming Shin-Kai Chen VLSI Signal Processing Laboratory Department of Electronics Engineering National Chiao.
Shekoofeh Azizi Spring  CUDA is a parallel computing platform and programming model invented by NVIDIA  With CUDA, you can send C, C++ and Fortran.
© David Kirk/NVIDIA and Wen-mei W. Hwu, , SSL 2014, ECE408/CS483, University of Illinois, Urbana-Champaign 1 ECE408 / CS483 Applied Parallel Programming.
GPU Programming EPCC The University of Edinburgh.
An Introduction to Programming with CUDA Paul Richmond
Illinois UPCRC Summer School 2010 The OpenCL Programming Model Part 1: Basic Concepts Wen-mei Hwu and John Stone with special contributions from Deepthi.
The Open Standard for Parallel Programming of Heterogeneous systems James Xu.
Instructor Notes This is a brief lecture which goes into some more details on OpenCL memory objects Describes various flags that can be used to change.
Basic CUDA Programming Computer Architecture 2014 (Prof. Chih-Wei Liu) Final Project – CUDA Tutorial TA Cheng-Yen Yang
Introduction to CUDA (1 of 2) Patrick Cozzi University of Pennsylvania CIS Spring 2012.
Introduction to CUDA 1 of 2 Patrick Cozzi University of Pennsylvania CIS Fall 2012.
Open CL Hucai Huang. Introduction Today's computing environments are becoming more multifaceted, exploiting the capabilities of a range of multi-core.
Computer Graphics Ken-Yi Lee National Taiwan University.
OpenCL Introduction AN EXAMPLE FOR OPENCL LU OCT
Basic CUDA Programming Computer Architecture 2015 (Prof. Chih-Wei Liu) Final Project – CUDA Tutorial TA Cheng-Yen Yang
High Performance Computing with GPUs: An Introduction Krešimir Ćosić, Thursday, August 12th, LSST All Hands Meeting 2010, Tucson, AZ GPU Tutorial:
Краткое введение в OpenCL. Примеры использования в научных вычислениях А.С. Айриян 7 мая 2015 Лаборатория информационных технологий.
CUDA All material not from online sources/textbook copyright © Travis Desell, 2012.
Instructor Notes This is a brief lecture which goes into some more details on OpenCL memory objects Describes various flags that can be used to change.
CIS 565 Fall 2011 Qing Sun
ITCS 6/8010 CUDA Programming, UNC-Charlotte, B. Wilkinson,
Automatic translation from CUDA to C++ Luca Atzori, Vincenzo Innocente, Felice Pantaleo, Danilo Piparo 31 August, 2015.
GPU Architecture and Programming
1 ITCS 4/5010 CUDA Programming, UNC-Charlotte, B. Wilkinson, Feb 28, 2013, OpenCL.ppt OpenCL These notes will introduce OpenCL.
Parallel Processing1 GPU Program Optimization (CS 680) Parallel Programming with CUDA * Jeremy R. Johnson *Parts of this lecture was derived from chapters.
Jie Chen. 30 Multi-Processors each contains 8 cores at 1.4 GHz 4GB GDDR3 memory offers ~100GB/s memory bandwidth.
OpenCL Programming James Perry EPCC The University of Edinburgh.
Introduction to CUDA (1 of n*) Patrick Cozzi University of Pennsylvania CIS Spring 2011 * Where n is 2 or 3.
Portability with OpenCL 1. High Performance Landscape High Performance computing is trending towards large number of cores and accelerators It would be.
1 GPU programming Dr. Bernhard Kainz. 2 Dr Bernhard Kainz Overview About myself Motivation GPU hardware and system architecture GPU programming languages.
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408/CS483, University of Illinois, Urbana-Champaign 1 ECE408 / CS483 Applied Parallel Programming.
OpenCL Joseph Kider University of Pennsylvania CIS Fall 2011.
Martin Kruliš by Martin Kruliš (v1.0)1.
Implementation and Optimization of SIFT on a OpenCL GPU Final Project 5/5/2010 Guy-Richard Kayombya.
Introduction to CUDA CAP 4730 Spring 2012 Tushar Athawale.
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408/CS483, ECE 498AL, University of Illinois, Urbana-Champaign ECE408 / CS483 Applied Parallel Programming.
© David Kirk/NVIDIA and Wen-mei W. Hwu, CS/EE 217 GPU Architecture and Programming Lecture 2: Introduction to CUDA C.
Introduction to CUDA 1 of 2 Patrick Cozzi University of Pennsylvania CIS Fall 2014.
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408/CS483, University of Illinois, Urbana-Champaign 1 ECE 8823A GPU Architectures Module 2: Introduction.
Would'a, CUDA, Should'a. CUDA: Compute Unified Device Architecture OU Supercomputing Symposium Highly-Threaded HPC.
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408, University of Illinois, Urbana-Champaign 1 Programming Massively Parallel Processors Lecture.
© David Kirk/NVIDIA and Wen-mei W. Hwu, ECE408/CS483, University of Illinois, Urbana-Champaign 1 ECE408 / CS483 Applied Parallel Programming.
Heterogeneous Computing with OpenCL Dr. Sergey Axyonov.
My Coordinates Office EM G.27 contact time:
OpenCL The Open Standard for Heterogenous Parallel Programming.
Instructor Notes This is a straight-forward lecture. It introduces the OpenCL specification while building a simple vector addition program The Mona Lisa.
Introduction to CUDA Programming Introduction to OpenCL Andreas Moshovos Spring 2011 Based on:
Heterogeneous Computing using openCL lecture 3 F21DP Distributed and Parallel Technology Sven-Bodo Scholz.
Lecture 15 Introduction to OpenCL
Computer Engg, IIT(BHU)
CUDA C/C++ Basics Part 2 - Blocks and Threads
CUDA Introduction Martin Kruliš by Martin Kruliš (v1.1)
CUDA Programming Model
Objective To Understand the OpenCL programming model
An Introduction to GPU Computing
Patrick Cozzi University of Pennsylvania CIS Spring 2011
Basic CUDA Programming
Lecture 11 – Related Programming Models: OpenCL
GPU Programming using OpenCL
Antonio R. Miele Marco D. Santambrogio Politecnico di Milano
Antonio R. Miele Marco D. Santambrogio Politecnico di Milano
ECE 8823A GPU Architectures Module 2: Introduction to CUDA C
© David Kirk/NVIDIA and Wen-mei W. Hwu,
CUDA Introduction Martin Kruliš by Martin Kruliš (v1.0)
6- General Purpose GPU Programming
Presentation transcript:

OpenCL

Sources Patrick Cozzi Spring 2011 NVIDIA CUDA Programming Guide CUDA by Example Programming Massively Parallel Processors

Install on Windows NVIDIA – CUDA Toolkit. AMD – AMD APP SDK. Also works with Intel's CPUs. Intel – the previous Intel SDK for OpenCL is now integrated into Intel's new tools, such as Intel INDE  All should work anywhere though

Include Header Files #include  CUDA_INC_PATH. On a x64 Windows 8.1 machine with CUDA 6.5 the environment variable CUDA_INC_PATH is defined as “C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include”  AMD SDK, you need to replace "$(CUDA_INC_PATH)" with "$(AMDAPPSDKROOT)/include" or, for Intel SDK, with "$(INTELOCLSDKROOT)/include".

Include Path

Libraries

Library Location As in the case of the includes, If you're using the AMD SDK, replace "$(CUDA_LIB_PATH)" with "$(AMDAPPSDKROOT)/lib/x86_64", or in the case of Intel with "$(INTELOCLSDKROOT)/lib/x64 ".

Drivers CPU drivers are installed with the SDK. GPU drivers come in a different package.  Need to install AMD Catalyst driver.

Image from:

OpenCL Open Compute Language For heterogeneous parallel-computing systems Cross-platform  Implementations for ATI GPUs NVIDIA GPUs x86 CPUs  Is cross-platform really one size fits all? Image from:

OpenCL Standardized Initiated by Apple Developed by the Khronos Group

Image from:

OpenCL API similar to OpenGL Based on the C language Easy transition form CUDA to OpenCL

OpenCL and CUDA Many OpenCL features have a one to one mapping to CUDA features OpenCL  More complex platform and device management  More complex kernel launch

OpenCL and CUDA Compute Unit (CU) correspond to  CUDA streaming multiprocessors (SMs)  CPU core  etc. Processing Element correspond to  CUDA streaming processor (SP)  CPU ALU

OpenCL and CUDA Image from:

OpenCL and CUDA CUDAOpenCL Kernel Host program ThreadWork item BlockWork group GridNDRange (index space)

OpenCL and CUDA Work Item (CUDA thread) – executes kernel code Index Space (CUDA grid) – defines work items and how data is mapped to them Work Group (CUDA block) – work items in a work group can synchronize

OpenCL and CUDA CUDA: threadIdx and blockIdx  Combine to create a global thread ID  Example blockIdx.x * blockDim.x + threadIdx.x

OpenCL and CUDA OpenCL: each thread has a unique global index  Retrieve with get_global_id() CUDAOpenCL threadIdx.xget_local_id(0) blockIdx.x * blockDim.x + threadIdx.x get_global_id(0)

OpenCL and CUDA CUDAOpenCL gridDim.xget_num_groups(0) blockIdx.xget_group_id(0) blockDim.xget_local_size(0) gridDim.x * blockDim.xget_global_size(0)

OpenCL and CUDA Image from: Recall CUDA:

get_ local_ size(1) OpenCL and CUDA Index Space In OpenCL: get_global_size(0) get_ global_ size(1) Work Group (0, 0) Work Group (1, 0) Work Group (2, 0) Work Group (0, 1) Work Group (1, 1) Work Group (2, 1) get_local_size(0) Work Item (0, 0) Work Group (0,0) Work Item (1, 0) Work Item (2, 0) Work Item (3, 0) Work Item (4, 0) Work Item (0, 1) Work Item (1, 1) Work Item (2, 1) Work Item (3, 1) Work Item (4, 1) Work Item (0, 2) Work Item (1, 2) Work Item (2, 2) Work Item (3, 2) Work Item (4, 2)

Image from

OpenCL and CUDA Image from Mapping to NVIDIA hardware:

OpenCL and CUDA Recall the CUDA memory model: Image from:

OpenCL and CUDA In OpenCL: Image from

OpenCL and CUDA CUDAOpenCL Global memory Constant memory Shared memoryLocal memory Private memory

OpenCL and CUDA CUDAOpenCL __syncthreads()__barrier() Both also have Fences  In CL mem_fence() read_mem_fence() write_mem_fence()

Image from:

OpenCL and CUDA __global__ void vecAdd(float *a, float *b, float *c) { int i = threadIdx.x; c[i] = a[i] + b[i]; } Kernel functions. Recall CUDA:

OpenCL and CUDA __kernel void vecAdd(__global const float *a, __global const float *b, __global float *c) { int i = get_global_id(0); c[i] = a[i] + b[i]; } In OpenCL:

OpenCL and CUDA __kernel void vecAdd(__global const float *a, __global const float *b, __global float *c) { int i = get_global_id(0); c[i] = a[i] + b[i]; } In OpenCL:

Slide from:

CUDA Streams OpenGL Buffers OpenGL Shader Programs

OpenCL API Walkthrough OpenCL host code for running our vecAdd kernel: __kernel void vecAdd(__global const float *a, __global const float *b, __global float *c) { int i = get_global_id(0); c[i] = a[i] + b[i]; } See NVIDIA OpenCL JumpStart Guide for full code example:

OpenCL API // create OpenCL device & context cl_context hContext; hContext = clCreateContextFromType(0, CL_DEVICE_TYPE_GPU, 0, 0, 0);

OpenCL API // create OpenCL device & context cl_context hContext; hContext = clCreateContextFromType(0, CL_DEVICE_TYPE_GPU, 0, 0, 0); Create a context for a GPU

OpenCL API // query all devices available to the context size_t nContextDescriptorSize; clGetContextInfo(hContext, CL_CONTEXT_DEVICES, 0, 0, &nContextDescriptorSize); cl_device_id aDevices = malloc(nContextDescriptorSize); clGetContextInfo(hContext, CL_CONTEXT_DEVICES, nContextDescriptorSize, aDevices, 0);

OpenCL API // query all devices available to the context size_t nContextDescriptorSize; clGetContextInfo(hContext, CL_CONTEXT_DEVICES, 0, 0, &nContextDescriptorSize); cl_device_id aDevices = malloc(nContextDescriptorSize); clGetContextInfo(hContext, CL_CONTEXT_DEVICES, nContextDescriptorSize, aDevices, 0); Retrieve an array of each GPU

OpenCL API // create a command queue for first // device the context reported cl_command_queue hCmdQueue; hCmdQueue = clCreateCommandQueue(hContext, aDevices[0], 0, 0);

OpenCL API // create a command queue for first // device the context reported cl_command_queue hCmdQueue; hCmdQueue = clCreateCommandQueue(hContext, aDevices[0], 0, 0); Create a command queue (CUDA stream) for the first GPU

OpenCL API // create & compile program cl_program hProgram; hProgram = clCreateProgramWithSource(hContext, 1, source, 0, 0); clBuildProgram(hProgram, 0, 0, 0, 0, 0);

OpenCL API // create & compile program cl_program hProgram; hProgram = clCreateProgramWithSource(hContext, 1, source, 0, 0); clBuildProgram(hProgram, 0, 0, 0, 0, 0); A program contains one or more kernels. Think dll. Provide kernel source as a string Can also compile offline

OpenCL API // create kernel cl_kernel hKernel; hKernel = clCreateKernel(hProgram, “vecAdd”, 0);

OpenCL API // create kernel cl_kernel hKernel; hKernel = clCreateKernel(hProgram, “vecAdd”, 0); Create kernel from program

OpenCL API // allocate host vectors float* pA = new float[cnDimension]; float* pB = new float[cnDimension]; float* pC = new float[cnDimension]; // initialize host memory randomInit(pA, cnDimension); randomInit(pB, cnDimension);

OpenCL API cl_mem hDeviceMemA = clCreateBuffer( hContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, cnDimension * sizeof(cl_float), pA, 0); cl_mem hDeviceMemB = /*... */

OpenCL API cl_mem hDeviceMemA = clCreateBuffer( hContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, cnDimension * sizeof(cl_float), pA, 0); cl_mem hDeviceMemB = /*... */ Create buffers for kernel input. Read only in the kernel. Written by the host.

OpenCL API hDeviceMemC = clCreateBuffer(hContext, CL_MEM_WRITE_ONLY, cnDimension * sizeof(cl_float), 0, 0);

OpenCL API hDeviceMemC = clCreateBuffer(hContext, CL_MEM_WRITE_ONLY, cnDimension * sizeof(cl_float), 0, 0); Create buffer for kernel output.

OpenCL API // setup parameter values clSetKernelArg(hKernel, 0, sizeof(cl_mem), (void *)&hDeviceMemA); clSetKernelArg(hKernel, 1, sizeof(cl_mem), (void *)&hDeviceMemB); clSetKernelArg(hKernel, 2, sizeof(cl_mem), (void *)&hDeviceMemC);

OpenCL API // setup parameter values clSetKernelArg(hKernel, 0, sizeof(cl_mem), (void *)&hDeviceMemA); clSetKernelArg(hKernel, 1, sizeof(cl_mem), (void *)&hDeviceMemB); clSetKernelArg(hKernel, 2, sizeof(cl_mem), (void *)&hDeviceMemC); Kernel arguments set by index

OpenCL API // execute kernel clEnqueueNDRangeKernel(hCmdQueue, hKernel, 1, 0, &cnDimension, 0, 0, 0, 0); // copy results from device back to host clEnqueueReadBuffer(hContext, hDeviceMemC, CL_TRUE, 0, cnDimension * sizeof(cl_float), pC, 0, 0, 0);

OpenCL API // execute kernel clEnqueueNDRangeKernel(hCmdQueue, hKernel, 1, 0, &cnDimension, 0, 0, 0, 0); // copy results from device back to host clEnqueueReadBuffer(hContext, hDeviceMemC, CL_TRUE, 0, cnDimension * sizeof(cl_float), pC, 0, 0, 0); Let OpenCL pick work group size Blocking read

OpenCL API delete [] pA; delete [] pB; delete [] pC; clReleaseMemObj(hDeviceMemA); clReleaseMemObj(hDeviceMemB); clReleaseMemObj(hDeviceMemC);

Loading Source

Host Program

Host Code