华南理工大学 陈虎 博士 tommychen74@yahoo.com.cn CUDA编程模型 华南理工大学 陈虎 博士 tommychen74@yahoo.com.cn.

Slides:



Advertisements
Similar presentations
定 格 入 格 破 格 —— 新诗仿写复习训练 仿照下列句子,再把 “ 人生 ” 比喻成 “ 大海 ”“ 天空 ” , 造两个句子。 如果说人生是一首优美的乐曲,那么痛苦则 是其中一个不可或缺的音符。 参考答案: 1 、如果说人生是一望无际的大海,那么挫折则 是其中一个骤然翻起的浪花。 2 、如果说人生是一片湛蓝的天空,那么失意则.
Advertisements

足太阴脾经在足大趾与足阳明胃经衔接, 在胸部与手少阴心经相接。 联系的脏腑器官有 咽、舌,属脾,络胃,注心中。 络脉从本经分出,走向足阳明经,进入腹腔,联络肠胃。 经别结于咽,贯舌本。 经筋结于髀,聚于阴器,上腹,结于脐,散于胸中。 第四章 足太阴经络与腧穴 第一节 足太阴经络.
实训15.散光软镜的复查 天津职业大学眼视光工程学院 王海英.
实训11:球面软镜的复查 天津职业大学眼视光工程学院 王海英.
新約研讀 彼得前書複習 讀經組
施工招标案例分析 (交流材料).
第 2 章 中央處理單元.
103年度學生健康檢查.
我的家乡 南通 ….
第二章 微型计算机系统 第一节 基本术语和基本概念 第二节 计算机系统的基本构成 第三节 微机系统的硬件组成 第四节 微机系统的软件组成.
CHAPTER 9 虛擬記憶體管理 9.2 分頁需求 9.3 寫入時複製 9.4 分頁替換 9.5 欄的配置法則 9.6 輾轉現象
教育局資安課程 戒慎恐懼-談公務上的資安認知.
行动起来,向‘零’艾滋迈进 合力抗艾,共担责任,共享未来.
专题三 生物圈中的绿色植物.
ACER商用笔记本产品介绍 ACER TM P243
关于《福建省房屋建筑和市政基础设施工程 标准施工招标文件(2015年版)》的要点介绍
最新計算機概論 第3章 計算機組織.
第二章 计算机硬件基础 --微型计算机硬件的组成.
复习回顾 2.2 计算机硬件系统 2.1 计算机发展概述 1、芯片组的作用是什么? 1、计算机分为几代?主要元器件是什么?
第四章 存储体系.
华南理工大学 陈虎 博士 多核处理器技术 华南理工大学 陈虎 博士
CUDA 超大规模并行程序设计 赵开勇 香港浸会大学计算机系 浪潮GPU高性能开发顾问.
五、学习方法及应考对策 (一)学习方法 1.保证复习时间,吃透教材:上课之前应该对课程相关内容进行预习,把不理解的问题记录下来,带着问题听课。考试之前务必把课本看3遍以上,第一遍一定要精读,最好能做笔记,边读边记,不要快,要记牢。第二、三遍可以查缺补漏型的看,通过做题目看书,加深课本印象。 2.加强概念、理论性内容的重复记忆:概念、理论性内容一般比较抽象,所以在理解的基础上一定要重复记忆,在接受辅导之后,再加以重点记忆,以便及时巩固所学内容,切忌走马观花似的复习,既浪费时间,效果也不好。
企业经营管理基础 模块一 企业组织结构概述 模块二 采购管理 模块三 生产管理 模块四 销售管理 模块五 仓储管理 模块六 人力资源管理
清华大学计算机科学与技术系高性能计算研究所 郑纬民 教授 2007年10月
2006年10月 面向数据处理的高端系统 胡雷钧 浪潮公司.
主讲教师:唐大仕 第5讲 计算机硬件 主讲教师:唐大仕
第 2 章 中央處理單元.
電腦硬體基本介紹 國立高雄大學資訊工程學系 林士倫 2010/10/21.
CUDA程序设计.
MOSFET for VGA Card.
異質計算教學課程內容 「異質計算」種子教師研習營 洪士灝 國立台灣大學資訊工程學系
第一章 C语言概述.
CPU資料處理 醫務管理暨醫療資訊學系 陳以德 副教授: 濟世CS 轉
并行计算实验上机 国家高性能计算中心(合肥).
Cuda 平行運算機制 報告者:林威辰.
淘宝核心系统数据库组 余锋 利用新硬件提升数据库性能 淘宝核心系统数据库组 余锋
1-1 微電腦系統單元 1-2 微電腦系統架構 1-3 微控制器(單晶片微電腦) 1-4 類比與數位訊號介面
1-1 微電腦系統單元 1-2 微電腦系統架構 1-3 微控制器(單晶片微電腦) 1-4 類比與數位訊號介面
单片机原理与应用 C/C++在现代数字计算机上的实现.
GPU分散式演算法設計與單機系統模擬(第二季)
5 Computer Organization (計算機組織).
第一章 認識Java Java 程式設計入門(I).
第2章 電腦硬體的架構及功能.
线程(Thread).
第8章 記憶體管理的概念.
電腦的硬體架構.
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
邹佳恒 第十八届全国科学计算与信息化会议 • 威海,
貨幣需求與貨幣市場的均衡.
第3章 認識處理元.
如何赢一个机械键盘
华南理工大学 陈虎 博士 CUDA例子程序——矩阵乘法 华南理工大学 陈虎 博士
易成 Institute of High Energy Physics
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
ARM Developer Suite 介 绍.
计算机系统结构(2012年春) ----存储层次: Cache基本概念
商業行為成立的要件 動動腦 Q 請試著判斷下列何者為商業行為? 請試著判斷下列何者為商業行為?.
OpenMP程序设计 2019/4/25.
藝術大師-達利.
小米手机3介绍 为发烧而生.
猜數字遊戲.
Chapter 7 掌控記憶體.
第六章 記憶體.
GPU based online noise filtering algorithm in LHASSO-WCDA
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
106年免試入學第一次模擬 選填重要日程表說明 1.106年1月10日中午12時~106年1月16日中午12時完成第一次模擬
参赛流程指引 (如何下载平台及报名参赛).
Introduction to the C Programming Language
第三章 计算机体系结构.
Presentation transcript:

华南理工大学 陈虎 博士 tommychen74@yahoo.com.cn CUDA编程模型 华南理工大学 陈虎 博士 tommychen74@yahoo.com.cn

GPU与CPU的差异 GPU(Graphics Process Unit) 通用CPU 面向计算密集型和大量数据并行化的计算 大量的晶体管用于计算单元 面向通用计算 大量的晶体管用于Cache和控制电路 DRAM Cache ALU Control DRAM CPU GPU

GPU与CPU的峰值速度比较 1 Based on slide 7 of S. Green, “GPU Physics,” SIGGRAPH 2007 GPGPU Course. http://www.gpgpu.org/s2007/slides/15-GPGPU-physics.pdf

第一代GPU结构(GeForce 6800)

第二代GPU(GeForece 8800)

GeForce 8800的主要技术参数 16个流多处理器(SM) 每个SM中包含了8个流处理器SP 每个SP包含一个乘加单元 晶体管数目(百万) 681 工艺 90nm 芯片面积(mm2) 470 工作主频(GHZ) 1.5 峰值速度(Gflops) 576 处理器数目 128 片上存储器容量(KB) 488 功耗(W) 150 16个流多处理器(SM) 每个SM中包含了8个流处理器SP 每个SP包含一个乘加单元 每个SM管理了24个线程簇(warp),共有768个线程 采用单线程多数据(Single-thread, Multiple-data)技术 每个周期在8个SP上并行执行一个线程簇

GF8800的存储层次结构 GeForce 8800 层次 容量 (KB) 延迟 (ns) 局部存储器 16 26 L1 Cache 5 280 L2 Cache 32 370 DDR 510 GeForce 8800

GPU最适合做什么? 对多个数据进行同一种运算(STMD适用) 一次存储器访问,多次运算(外部DDR访问开销高,局部存储器容量较小) 浮点计算比例高(特别是单精度浮点) 典型计算:物理模拟,线性代数计算 应用领域: 计算生物学 图像处理

CUDA编程模型 Nvidia公司开发的编程模型 可以和VC 8.0集成使用 下载地址: http://www.nvidia.com/object/cuda_get.html

CUDA工具链 Compiler Target code C/C++ CUDA Application NVCC CPU Code float4 me = gx[gtid]; me.x += me.y * me.z; NVCC CPU Code 链接时的动态库: The CUDA runtime library (cudart) The CUDA core library (cuda) PTX Code Virtual Physical PTX to Target Compiler ld.global.v4.f32 {$f1,$f3,$f5,$f7}, [$r9+0]; mad.f32 $f1, $f5, $f3, $f1; G80 … GPU Target code

CUDA中的线程 线程: 每个线程有一个唯一的标识ID——threadIdx 若干线程还可以组成块(Block) 硬件支持,开销很小; 所有线程执行相同的代码(STMD) 每个线程有一个唯一的标识ID——threadIdx 若干线程还可以组成块(Block) 线程块可以呈一维、二维或者三维结构 Device Grid 1 Block (0, 0) (1, 0) (2, 0) (0, 1) (1, 1) (2, 1) Block (1, 1) Thread (3, 1) (4, 1) (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) (3, 0) (4, 0)

CUDA存储器分配 cudaMalloc() cudaFree() 在全局存储器中分配空间 两个参数: 在全局存储器中回收空间 参数 地址指针 空间大小 cudaFree() 在全局存储器中回收空间 参数 回收空间地址指针 Grid Block (0, 0) Block (1, 0) Shared Memory Shared Memory Registers Registers Registers Registers Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0) Host Global Memory

示范代码 分配64 * 64的单精度浮点数组 存储器地址为Md.elements TILE_WIDTH = 64; Matrix Md /*“d” is often used to indicate a device data structure*/ int size = TILE_WIDTH * TILE_WIDTH * sizeof(float); cudaMalloc((void**)&Md.elements, size); cudaFree(Md.elements);

主机和设备之间的数据传输 cudaMemcpy() 异步传输 存储器数据传输 参数: 目的地址 源地址 传输字节数 传输类型 主机<->主机 主机<->全局存储器 全局存储器<->全局存储器 异步传输 Grid Block (0, 0) Block (1, 0) Shared Memory Shared Memory Registers Registers Registers Registers Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0) Host Global Memory

示范代码 传输 64 * 64 单精度浮点数组 M在主机存储器中 Md在设备存储器中 传输方向常数: cudaMemcpyHostToDevice cudaMemcpyDeviceToHost cudaMemcpy(Md.elements, M.elements, size, cudaMemcpyHostToDevice); cudaMemcpy(M.elements, Md.elements, size, cudaMemcpyDeviceToHost);

CUDA的函数声明 __global__定义一个内核函数 必须返回 void __device__ 和 __host__可以一起使用 在哪里执行: 只能从哪里调用: __device__ float DeviceFunc() 设备 __global__ void KernelFunc() 主机 __host__ float HostFunc() __global__定义一个内核函数 必须返回 void __device__ 和 __host__可以一起使用

CUDA 的函数声明(续) __device__ 函数不能使用函数指针; __device__函数在设备上执行,所以: 不能递归 不能在函数内定义静态变量 不能使用变量作为参数

调用一个内核函数– 线程生成 内核函数必须使用执行配置调用: 任何从CUDA 1.0调用的内核函数都是异步的, 阻塞需要显式的同步。 __global__ void KernelFunc(...); dim3 DimGrid(100, 50); // 5000 thread blocks dim3 DimBlock(4, 8, 8); // 256 threads per block size_t SharedMemBytes = 64; // 64 bytes of shared memory KernelFunc<<< DimGrid, DimBlock, SharedMemBytes >>> (...); //用<<<, >>>指明该函数调用的线程数 任何从CUDA 1.0调用的内核函数都是异步的, 阻塞需要显式的同步。

CUDA变量类型修饰符 当使用__local__, __shared__, 和 __constant__时, __device__ 是可选的 变量声明 存储器 作用域 生命期 __device__ __local__ int LocalVar; 本地存储器 thread __device__ __shared__ int SharedVar; 共享存储器 block __device__ int GlobalVar; 全局存储器 grid application __device__ __constant__ int ConstantVar; 常存储器 当使用__local__, __shared__, 和 __constant__时, __device__ 是可选的 没有任何修饰符的自动变量将默认放在寄存器内 数组除外,它们将会被摆放在本地存储器内

在哪里声明变量? 寄存器 (自动) 共享存储器 本地存储器 全局存储器 常存储器 20

G80 的CUDA存储器实现 每一个thread 可以: 可以读写寄存器 可以读写本地存储器 每一个block可以读写 共享存储器 每一个grid 可以读写 全局存储器 每一个grid 只可读 常数存储器 Grid Block (0, 0) Block (1, 0) Shared Memory Shared Memory Registers Registers Registers Registers Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0) Host Global Memory Constant Memory 21

通用的编程策略 全局存储器在设备内存中(DRAM) 它的访问速度比共享存储器要慢 在设备上执行运算的优化方法是: 把数据分割成子集,放入共享存储器中 以一个线程块操作一个数据子集: 从全局存储器读入数据子集到共享存储器,使用多个线程实现存储级并行 在共享存储器中对数据子集执行运算; 每一个线程可以有效率地多次访问任何数据元素 从共享存储器上拷贝结果到全局存储器 22

通用的编程策略(续) 常数存储器也在设备内存里(DRAM) –比访问共享存储器慢得多 通过访问模式小心划分数据 但是它可以高速缓存,对于只读数据的访问非常高效。 通过访问模式小心划分数据 只读 常数存储器(若在高速缓存内,非常快) 在块内读写共享 共享存储器(非常快) 线程可读写 寄存器 (非常快) 读写输入和结果 全局存储器(非常慢)

变量类型约束 指针只能指向在全局存储器已分配或声明的内存 : 在主机分配,然后传递给内核: __global__ void KernelFunc(float* ptr) 以全局变量的地址获得: float* ptr = &GlobalVar; 24

CUDA编程框架 //全局变量声明 __host__ ,…, __device__... __global__, __constant__, __texture__ //函数原型声明 __global__ void kernelOne(…) //内核函数 float handyFunction(…) //普通函数 main(){ cudaMalloc(&d_GlblVarPtr, bytes ) //在设备上分配空间 cudaMemCpy(d_GlblVarPtr, h_Gl…) //从主机传输数据到设备 执行内核函数时的配置 kernelOne<<<execution configuration>>>( args… );//调用内核函数 cudaMemCpy(h_GlblVarPtr,…); //从设备传输结果到主机 } __global__ void kernelOne(type args,…){ //内核函数 //局部变量声明 __local__, __shared__ //自动变量被默认分配到寄存器或本地存储器中 float handyFunction(int inVar…){ //普通函数