CUDA(五) 周斌 CUDA/GPU编程模型

  1. CPU和GPU互动模型:CPU和GPU交互,互联结构
  2. GPU的线程组织模型(不停的强化)
  3. GPU存储模型
  4. 基本的编程

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_可以同时使用

对索引要小心使用。

猜你喜欢

转载自blog.csdn.net/fanre/article/details/83140865