主要内容:cpu和gpu互动模式,gpu线程组织模型(不停强化),gpu存储模型,基本的编程问题
cpu-gpu交互
有各自的物理内存空间,通过PCIE总线互连8GB/s~16GB/s,交互开销很大
访存速度,之所以有访存速度的层次划分是在价格上和性能上的一个折中,不得不考虑到成本问题
寄存器和共享存储单元的速度是一个时钟周期,非常快
local memory放在显存芯片里的片外内存和global memory 在显存里面的,对于整个处理器来说,慢的(不懂啊)
constant memory , texture memory, instruction memory(invisible) 都在DRAM立面
GPU的线程组织模型
thread->block->grid(最大)线程的一些组合变成WARP,WARP在block里
线程组织架构说明
一个Kernel具有大量线程,线程呗划分成线程块blocks,一个线程块内部的线程共享内存Shared Memory可以同步‘_syncthread'
Kernel启动一个grid,包含若干线程块(用户设定)。线程和线程块都有唯一的标识
SM表示流动处理器,一个SM有32个cuda核
GPU线程映射关系
(没听懂,图也看不清)
GPU内存和线程关系
一个thread有私有的local memory(还有私有的寄存器),一个block里所有的线程有shared memory
整个设备呢,有个共有的Global Memory ,共享的
主机端存储器可以和很多设备存储器交互(就是多个显卡同时干活)
编程模型
常规意义的GPU用于处理图形图像,操作于像素,每个像素的操作都类似,可以应用于SIMD
SIMD也可以认为不仅是指令面上,也可以认为是数据并行分割的,就像数组相加矢量操作
SIMT单指令多线程
GPU版本的SIMD,大量线程模型获得高度并行,线程切换获得延迟隐藏,多个线程执行相同指令流,GPU上大量线程承载运行
CUDA编程模式:Extended C
是扩展的C语言,增加了一些修饰词,关键词
__device__执行位置是device,调用位置是device(就是显卡,哈哈)
__global__执行位置是device,调用位置是host(主机端,cpu)它定义了个Kernel函数,是入口函数,cpu上调用,gpu上执行,必须返回void
__host__执行位置是host,调用位置是host
__device__和__host__可以同时调用