- CPU和GPU互动模型:CPU和GPU交互,互联结构
- GPU的线程组织模型(不停的强化)
- GPU存储模型
- 基本的编程
CPU-GPU交互
- 各自的物理内存空间,内存慢慢的贡献
- 通过PCIE总线互连(8GB/s~16GB/s)
- 交互开销较大
CPU部分:CPU+内存+芯片
GPU部分:GPU芯片+显存GDDR ,金手指pcie
GPU存储器层次架构(硬件)
openCL和CUDA类似
private memory私有内存空间--寄存器
workitem--ALU处理核
computeunit计算单元--SM
local memory 本地共享存储器
访存速度:缓存设计是成本和速度的折中
Register - dedicated HW -single cycle寄存器,硬件支撑,周期
Shared Memory - dedicated HW -single cycle硬件支撑
Local Memory - DRAM, no cache -*slow* 每个SM内部线程私有寄存器以外,放不下,就放在显存中的,芯片之外
Global Memory - DRAM, no cache -*slow*显存中的一部分,慢是相对GPU访存层次,比CPU快
Constant Memory - DRAM, cached - 1...10s...100s of cycles ,depending on cache locality显存中有缓存管理
Texture Memory - DRAM, cached - 1...10s...100s of cycles ,depending on cache locality纹理存储器,显存中,有cache,对不规则临近的小数据访问好一些
Instruction Memory (invisible)- DRAM, cached 指令存储单元,底层,对程序设计者不可见。
GPU结构
SM结构 ->四组处理单元-》每组有32个ALU
有共享部分和统一调度
Gpu线程组织模型
Grid若干个block组成,->Block线程块,若干个线程组成,为了便于组织->Thread完成特定任务一段代码。
开发者实际改变grid,block,thread个数
warp线轴,管理线程,有32个连续线程组成
线程组织架构说明
一个Kernel具有大量的线程,一个完整的代码
线程划分成多个线程块block
一个block内部的线程共享shared memory
可以同步_syncthreads()
Kernel启动一个grid,包括若干个线程块
用户设定
线程和线程块具有唯一标识
GPU线程映射关系
software->Thread->
GPU--处理单元(线程处理器ALU CUDA核,执行完整线程基本单元)
Thread Block-线程块-->多处理器
thread grid线程网格-->完整设备
CPU : 线程-》SSE标量处理器
线程块-》SSE矢量处理单元
网格-》CPU多核系统
CPU内存和线程等关系
每个线程有自己的私有的:寄存器+localmemory,不共享
线程块有共享存储区。
整个设备有一个globalmemory,
主机端和存储器不同设备进行交互。
kernel串行的
编程模型
常规来说GPU用于图形图像处理
操作与像素或者像素块,每一个像素操作类似。天然的并行
可以应用SIMD(single instruction multiple data )
SIMD(single instruction multiple data)数据并行分割,指令理解
Single Instruction Multiple Thread(SIMT),线程模型
GPU版本的SIMD
大量线程模型获得高度并行
线程切换获得延迟掩藏
多个线程执行相同的指令流
GPU上大量的线程承载和调度
CUDA 编程模式:Extended C,扩展的C语言
Declspecs (不声明则在cpu上执行)
global,device,shared ,local, constant 修饰词代表放在不同的GPU存储器的位置
关键字
threadIds, blockIdx线程索引和内件
Intrinsics
_syncthreads
运行期的API
Memory ,symbol, execution, management调用GPU函数
函数调用,要有特定配置
CUDA函数声明
执行位置 | 调用位置 | |
_device_ float DeviceFunc() | device | device |
_global_ void KernelFunc() | device GPU | host |
_host_ float HostFunc() | host主机 | host |
_gobal_定义一个kernel函数
入口函数,CPU调用,GPU上执行。CPU端代码执行到一定程度调用GPU的入口函数,在GPU上启动起来入口函数,相关配置,比如多少个线程块,每个线程块的特点
必须返回void
_device_ and _host_可以同时使用
对索引要小心使用。